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 #-}
65
76module Main (main ) where
87
@@ -17,11 +16,8 @@ import Development.IDE.Test
1716import Ide.Plugin.CallHierarchy
1817import qualified Language.LSP.Protocol.Lens as L
1918import qualified Language.LSP.Test as Test
20- import System.Directory.Extra
2119import System.FilePath
22- import qualified System.IO.Extra
2320import Test.Hls
24- import Test.Hls.Util (withCanonicalTempDir )
2521
2622plugin :: PluginTestDescriptor ()
2723plugin = mkPluginTestDescriptor' descriptor " call-hierarchy"
@@ -196,20 +192,16 @@ incomingCallsTests :: TestTree
196192incomingCallsTests =
197193 testGroup " Incoming Calls"
198194 [ testGroup " single file"
199- [
200- testCase " xdata unavailable" $
195+ [ testCase " xdata unavailable" $
201196 runSessionWithServer def plugin testDataDir $ do
202197 doc <- createDoc " A.hs" " haskell" $ T. unlines [" a=3" , " b=a" ]
203198 waitForIndex (testDataDir </> " A.hs" )
204- [ item] <- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 1 0 )
199+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 1 0 )
205200 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
213205 closeDoc doc
214206 , testCase " xdata available" $ do
215207 let contents = T. unlines [" a=3" ," b=a" ]
@@ -321,20 +313,16 @@ outgoingCallsTests :: TestTree
321313outgoingCallsTests =
322314 testGroup " Outgoing Calls"
323315 [ testGroup " single file"
324- [
325- testCase " xdata unavailable" $ withCanonicalTempDir $ \ dir ->
316+ [ testCase " xdata unavailable" $ withCanonicalTempDir $ \ dir ->
326317 runSessionWithServer def plugin dir $ do
327318 doc <- createDoc " A.hs" " haskell" $ T. unlines [" a=3" , " b=a" ]
328319 waitForIndex (dir </> " A.hs" )
329- [ item] <- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 0 1 )
320+ item <- expectOneElement =<< Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 0 1 )
330321 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
338326 closeDoc doc
339327 , testCase " xdata available" $ do
340328 let contents = T. unlines [" a=3" , " b=a" ]
@@ -434,13 +422,9 @@ incomingCallTestCase contents queryX queryY positions ranges = withCanonicalTemp
434422 )
435423 (zip positions ranges)
436424 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
444428 closeDoc doc
445429
446430incomingCallMultiFileTestCase :: FilePath -> Int -> Int -> M. Map FilePath [((Int , Int ), Range )] -> Assertion
@@ -456,13 +440,9 @@ incomingCallMultiFileTestCase filepath queryX queryY mp =
456440 <&> map (, range)
457441 ) pr) mp
458442 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
466446 closeDoc doc
467447
468448outgoingCallTestCase :: T. Text -> Int -> Int -> [(Int , Int )] -> [Range ] -> Assertion
@@ -476,12 +456,9 @@ outgoingCallTestCase contents queryX queryY positions ranges = withCanonicalTemp
476456 )
477457 (zip positions ranges)
478458 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
485462 closeDoc doc
486463
487464outgoingCallMultiFileTestCase :: FilePath -> Int -> Int -> M. Map FilePath [((Int , Int ), Range )] -> Assertion
@@ -497,25 +474,25 @@ outgoingCallMultiFileTestCase filepath queryX queryY mp =
497474 <&> map (, range)
498475 ) pr) mp
499476 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
506480 closeDoc doc
507481
508482oneCaseWithCreate :: T. Text -> Int -> Int -> (Uri -> CallHierarchyItem -> Assertion ) -> Assertion
509483oneCaseWithCreate contents queryX queryY expected = withCanonicalTempDir $ \ dir ->
510484 runSessionWithServer def plugin dir $ do
511485 doc <- createDoc " A.hs" " haskell" contents
512486 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
517489 closeDoc doc
518490
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+
519496mkCallHierarchyItem' :: String -> T. Text -> SymbolKind -> Range -> Range -> Uri -> CallHierarchyItem -> Assertion
520497mkCallHierarchyItem' prefix name kind range selRange uri c@ (CallHierarchyItem name' kind' tags' detail' uri' range' selRange' xdata') = do
521498 assertHierarchyItem name name'
@@ -528,7 +505,7 @@ mkCallHierarchyItem' prefix name kind range selRange uri c@(CallHierarchyItem na
528505 case xdata' of
529506 Nothing -> assertFailure (" In " ++ show c ++ " , got Nothing for data but wanted " ++ show xdata)
530507 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' )
532509 Aeson. Error err -> assertFailure (" In " ++ show c ++ " wanted data prefix: " ++ show xdata ++ " but json parsing failed with " ++ show err)
533510 where
534511 tags = Nothing
@@ -570,6 +547,6 @@ waitForIndex fp1 = skipManyTill anyMessage $ void $ referenceReady lenientEquals
570547 -- filepath from the message
571548 lenientEquals :: FilePath -> Bool
572549 lenientEquals fp2
573- | isRelative fp1 = any (equalFilePath fp1) ( map ( foldr (</>) " " ) $ tails $ splitDirectories fp2)
550+ | isRelative fp1 = any (equalFilePath fp1 . joinPath) $ tails $ splitDirectories fp2
574551 | otherwise = equalFilePath fp1 fp2
575552
0 commit comments