1
- {-# LANGUAGE LambdaCase #-}
2
- {-# LANGUAGE OverloadedStrings #-}
3
- {-# LANGUAGE RankNTypes #-}
4
- {-# LANGUAGE StandaloneDeriving #-}
5
- {-# LANGUAGE TupleSections #-}
1
+ {-# LANGUAGE LambdaCase #-}
2
+ {-# LANGUAGE OverloadedStrings #-}
3
+ {-# LANGUAGE RankNTypes #-}
4
+ {-# LANGUAGE TupleSections #-}
6
5
7
6
module Main (main ) where
8
7
@@ -17,11 +16,8 @@ import Development.IDE.Test
17
16
import Ide.Plugin.CallHierarchy
18
17
import qualified Language.LSP.Protocol.Lens as L
19
18
import qualified Language.LSP.Test as Test
20
- import System.Directory.Extra
21
19
import System.FilePath
22
- import qualified System.IO.Extra
23
20
import Test.Hls
24
- import Test.Hls.Util (withCanonicalTempDir )
25
21
26
22
plugin :: PluginTestDescriptor ()
27
23
plugin = mkPluginTestDescriptor' descriptor " call-hierarchy"
@@ -196,20 +192,16 @@ incomingCallsTests :: TestTree
196
192
incomingCallsTests =
197
193
testGroup " Incoming Calls"
198
194
[ testGroup " single file"
199
- [
200
- testCase " xdata unavailable" $
195
+ [ testCase " xdata unavailable" $
201
196
runSessionWithServer def plugin testDataDir $ do
202
197
doc <- createDoc " A.hs" " haskell" $ T. unlines [" a=3" , " b=a" ]
203
198
waitForIndex (testDataDir </> " A.hs" )
204
- [ item] <- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 1 0 )
199
+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 1 0 )
205
200
let expected = [CallHierarchyIncomingCall item [mkRange 1 2 1 3 ]]
206
- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 0 0 ) >>=
207
- \ case
208
- [item] -> do
209
- let itemNoData = set L. data_ Nothing item
210
- Test. incomingCalls (mkIncomingCallsParam itemNoData) >>=
211
- \ res -> liftIO $ sort expected @=? sort res
212
- _ -> liftIO $ assertFailure " Not exactly one element"
201
+ item' <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 0 0 )
202
+ let itemNoData = set L. data_ Nothing item'
203
+ res <- Test. incomingCalls (mkIncomingCallsParam itemNoData)
204
+ liftIO $ sort expected @=? sort res
213
205
closeDoc doc
214
206
, testCase " xdata available" $ do
215
207
let contents = T. unlines [" a=3" ," b=a" ]
@@ -321,20 +313,16 @@ outgoingCallsTests :: TestTree
321
313
outgoingCallsTests =
322
314
testGroup " Outgoing Calls"
323
315
[ testGroup " single file"
324
- [
325
- testCase " xdata unavailable" $ withCanonicalTempDir $ \ dir ->
316
+ [ testCase " xdata unavailable" $ withCanonicalTempDir $ \ dir ->
326
317
runSessionWithServer def plugin dir $ do
327
318
doc <- createDoc " A.hs" " haskell" $ T. unlines [" a=3" , " b=a" ]
328
319
waitForIndex (dir </> " A.hs" )
329
- [ item] <- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 0 1 )
320
+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 0 1 )
330
321
let expected = [CallHierarchyOutgoingCall item [mkRange 1 2 1 3 ]]
331
- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 1 0 ) >>=
332
- \ case
333
- [item] -> do
334
- let itemNoData = set L. data_ Nothing item
335
- Test. outgoingCalls (mkOutgoingCallsParam itemNoData) >>=
336
- \ res -> liftIO $ sort expected @=? sort res
337
- _ -> liftIO $ assertFailure " Not exactly one element"
322
+ item' <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 1 0 )
323
+ let itemNoData = set L. data_ Nothing item'
324
+ res <- Test. outgoingCalls (mkOutgoingCallsParam itemNoData)
325
+ liftIO $ sort expected @=? sort res
338
326
closeDoc doc
339
327
, testCase " xdata available" $ do
340
328
let contents = T. unlines [" a=3" , " b=a" ]
@@ -434,13 +422,9 @@ incomingCallTestCase contents queryX queryY positions ranges = withCanonicalTemp
434
422
)
435
423
(zip positions ranges)
436
424
let expected = map mkCallHierarchyIncomingCall items
437
- -- liftIO delay
438
- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY) >>=
439
- \ case
440
- [item] -> do
441
- Test. incomingCalls (mkIncomingCallsParam item) >>=
442
- \ res -> liftIO $ sort expected @=? sort res
443
- _ -> liftIO $ assertFailure " Not one element"
425
+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY)
426
+ res <- Test. incomingCalls (mkIncomingCallsParam item)
427
+ liftIO $ sort expected @=? sort res
444
428
closeDoc doc
445
429
446
430
incomingCallMultiFileTestCase :: FilePath -> Int -> Int -> M. Map FilePath [((Int , Int ), Range )] -> Assertion
@@ -456,13 +440,9 @@ incomingCallMultiFileTestCase filepath queryX queryY mp =
456
440
<&> map (, range)
457
441
) pr) mp
458
442
let expected = map mkCallHierarchyIncomingCall items
459
- -- liftIO delay
460
- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY) >>=
461
- \ case
462
- [item] -> do
463
- Test. incomingCalls (mkIncomingCallsParam item) >>=
464
- \ res -> liftIO $ sort expected @=? sort res
465
- _ -> liftIO $ assertFailure " Not one element"
443
+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY)
444
+ res <- Test. incomingCalls (mkIncomingCallsParam item)
445
+ liftIO $ sort expected @=? sort res
466
446
closeDoc doc
467
447
468
448
outgoingCallTestCase :: T. Text -> Int -> Int -> [(Int , Int )] -> [Range ] -> Assertion
@@ -476,12 +456,9 @@ outgoingCallTestCase contents queryX queryY positions ranges = withCanonicalTemp
476
456
)
477
457
(zip positions ranges)
478
458
let expected = map mkCallHierarchyOutgoingCall items
479
- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY) >>=
480
- \ case
481
- [item] -> do
482
- Test. outgoingCalls (mkOutgoingCallsParam item) >>=
483
- \ res -> liftIO $ sort expected @=? sort res
484
- _ -> liftIO $ assertFailure " Not one element"
459
+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY)
460
+ res <- Test. outgoingCalls (mkOutgoingCallsParam item)
461
+ liftIO $ sort expected @=? sort res
485
462
closeDoc doc
486
463
487
464
outgoingCallMultiFileTestCase :: FilePath -> Int -> Int -> M. Map FilePath [((Int , Int ), Range )] -> Assertion
@@ -497,25 +474,25 @@ outgoingCallMultiFileTestCase filepath queryX queryY mp =
497
474
<&> map (, range)
498
475
) pr) mp
499
476
let expected = map mkCallHierarchyOutgoingCall items
500
- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY) >>=
501
- \ case
502
- [item] -> do
503
- Test. outgoingCalls (mkOutgoingCallsParam item) >>=
504
- \ res -> liftIO $ sort expected @=? sort res
505
- _ -> liftIO $ assertFailure " Not one element"
477
+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY)
478
+ res <- Test. outgoingCalls (mkOutgoingCallsParam item)
479
+ liftIO $ sort expected @=? sort res
506
480
closeDoc doc
507
481
508
482
oneCaseWithCreate :: T. Text -> Int -> Int -> (Uri -> CallHierarchyItem -> Assertion ) -> Assertion
509
483
oneCaseWithCreate contents queryX queryY expected = withCanonicalTempDir $ \ dir ->
510
484
runSessionWithServer def plugin dir $ do
511
485
doc <- createDoc " A.hs" " haskell" contents
512
486
waitForIndex (dir </> " A.hs" )
513
- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY) >>=
514
- \ case
515
- [item] -> liftIO $ expected (doc ^. L. uri) item
516
- res -> liftIO $ assertFailure " Not one element"
487
+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY)
488
+ liftIO $ expected (doc ^. L. uri) item
517
489
closeDoc doc
518
490
491
+ expectOneElement :: [a ] -> Session a
492
+ expectOneElement = \ case
493
+ [x] -> pure x
494
+ xs -> liftIO . assertFailure $ " Expecting exactly one element, but got " ++ show (length xs)
495
+
519
496
mkCallHierarchyItem' :: String -> T. Text -> SymbolKind -> Range -> Range -> Uri -> CallHierarchyItem -> Assertion
520
497
mkCallHierarchyItem' prefix name kind range selRange uri c@ (CallHierarchyItem name' kind' tags' detail' uri' range' selRange' xdata') = do
521
498
assertHierarchyItem name name'
@@ -528,7 +505,7 @@ mkCallHierarchyItem' prefix name kind range selRange uri c@(CallHierarchyItem na
528
505
case xdata' of
529
506
Nothing -> assertFailure (" In " ++ show c ++ " , got Nothing for data but wanted " ++ show xdata)
530
507
Just v -> case Aeson. fromJSON v of
531
- Aeson. Success v -> assertBool (" In " ++ show c ++ " wanted data prefix: " ++ show xdata) (xdata `T.isPrefixOf` v)
508
+ Aeson. Success v' -> assertBool (" In " ++ show c ++ " wanted data prefix: " ++ show xdata) (xdata `T.isPrefixOf` v' )
532
509
Aeson. Error err -> assertFailure (" In " ++ show c ++ " wanted data prefix: " ++ show xdata ++ " but json parsing failed with " ++ show err)
533
510
where
534
511
tags = Nothing
@@ -570,6 +547,6 @@ waitForIndex fp1 = skipManyTill anyMessage $ void $ referenceReady lenientEquals
570
547
-- filepath from the message
571
548
lenientEquals :: FilePath -> Bool
572
549
lenientEquals fp2
573
- | isRelative fp1 = any (equalFilePath fp1) ( map ( foldr (</>) " " ) $ tails $ splitDirectories fp2)
550
+ | isRelative fp1 = any (equalFilePath fp1 . joinPath) $ tails $ splitDirectories fp2
574
551
| otherwise = equalFilePath fp1 fp2
575
552
0 commit comments