|
1 | 1 | {-# LANGUAGE OverloadedStrings #-} |
| 2 | +{-# LANGUAGE RecordWildCards #-} |
2 | 3 |
|
3 | | -module FoldingRange ( |
4 | | - foldingRangeTests, |
5 | | -) where |
6 | 4 |
|
7 | | -import Language.LSP.Protocol.Message (Method (Method_TextDocumentFoldingRange, Method_TextDocumentSelectionRange), |
8 | | - SMethod (SMethod_TextDocumentFoldingRange, SMethod_TextDocumentSelectionRange)) |
| 5 | +module FoldingRange (foldingRangeTests) where |
| 6 | + |
| 7 | +import qualified Data.ByteString.Char8 as C8 |
| 8 | +import Distribution.Fields.Field (Field (..), Name (..)) |
| 9 | +import qualified Distribution.Parsec.Position as Cabal |
| 10 | +import Ide.Plugin.Cabal.FoldingRange (foldingRangeForField) |
9 | 11 | import qualified Language.LSP.Protocol.Types as LSP |
10 | | -import qualified Test.Hls as T |
11 | | -import Utils |
12 | | - |
13 | | -testFoldingRanges :: (T.HasCallStack) |
14 | | - => T.TestName |
15 | | - -> FilePath |
16 | | - -> [LSP.FoldingRange] |
17 | | - -> T.TestTree |
18 | | -testFoldingRanges testName path expectedRanges = |
19 | | - runCabalTestCaseSession testName "folding-range-cabal" $ do |
20 | | - docId <- T.openDoc path "cabal" |
21 | | - ranges <- getFoldingRanges docId |
22 | | - T.liftIO $ ranges T.@?= Right expectedRanges |
23 | | - |
24 | | -foldingRangeTests :: T.TestTree |
25 | | -foldingRangeTests = |
26 | | - T.testGroup "Cabal FoldingRange Tests" |
27 | | - [ testFoldingRanges |
28 | | - "cabal Field folding range test" |
29 | | - "field.cabal" |
30 | | - [fieldFoldingRange] |
31 | | - , testFoldingRanges |
32 | | - "cabal FieldLine folding range test" |
33 | | - "fieldline.cabal" |
34 | | - [fieldLineFoldingRange] |
35 | | - , testFoldingRanges |
36 | | - "cabal Section folding range test" |
37 | | - "section.cabal" |
38 | | - [sectionFoldingRange] |
39 | | - , testFoldingRanges |
40 | | - "cabal SectionArg folding range test" |
41 | | - "sectionarg.cabal" |
42 | | - [sectionArgFoldingRange] |
43 | | - ] |
44 | | - |
45 | | --- Expected folding range for field.cabal |
46 | | -fieldFoldingRange :: LSP.FoldingRange |
47 | | -fieldFoldingRange = |
48 | | - (defFoldingRange (LSP.Position 0 0)) |
49 | | - { LSP._endLine = 0 |
50 | | - , LSP._endCharacter = Just 8 |
51 | | - , LSP._collapsedText = Just "homepage" |
52 | | - } |
53 | | - |
54 | | --- Expected folding range for fieldline.cabal |
55 | | -fieldLineFoldingRange :: LSP.FoldingRange |
56 | | -fieldLineFoldingRange = |
57 | | - (defFoldingRange (LSP.Position 0 0)) |
58 | | - { LSP._endLine = 0 |
59 | | - , LSP._endCharacter = Just 13 |
60 | | - , LSP._collapsedText = Just "cabal-version" |
61 | | - } |
62 | | - |
63 | | --- Expected folding range for section.cabal |
64 | | -sectionFoldingRange :: LSP.FoldingRange |
65 | | -sectionFoldingRange = |
66 | | - (defFoldingRange (LSP.Position 0 2)) |
67 | | - { LSP._endLine = 0 |
68 | | - , LSP._endCharacter = Just 15 |
69 | | - , LSP._collapsedText = Just "build-depends" |
70 | | - } |
71 | | - |
72 | | --- Expected folding range for sectionarg.cabal |
73 | | -sectionArgFoldingRange :: LSP.FoldingRange |
74 | | -sectionArgFoldingRange = |
75 | | - (defFoldingRange (LSP.Position 0 2)) |
76 | | - { LSP._endLine = 1 |
77 | | - , LSP._endCharacter = Just 17 |
78 | | - , LSP._collapsedText = Just "if os(windows)" |
79 | | - } |
80 | | - |
81 | | -getFoldingRanges :: LSP.TextDocumentIdentifier -> Session (Either ResponseError [LSP.FoldingRange]) |
82 | | -getFoldingRanges docId = do |
83 | | - let params = LSP.FoldingRangeParams docId Nothing |
84 | | - request SMethod_TextDocumentFoldingRange params |
85 | | - |
86 | | -defFoldingRange :: LSP.Position -> LSP.FoldingRange |
87 | | -defFoldingRange startPos = |
88 | | - LSP.FoldingRange |
89 | | - { LSP._startLine = LSP._line startPos |
90 | | - , LSP._startCharacter = Just (LSP._character startPos) |
91 | | - , LSP._endLine = LSP._line startPos |
92 | | - , LSP._endCharacter = Just (LSP._character startPos) |
93 | | - , LSP._kind = Nothing |
94 | | - , LSP._collapsedText = Nothing |
95 | | - } |
| 12 | +import Test.Hls |
| 13 | + |
| 14 | + |
| 15 | +foldingRangeTests :: TestTree |
| 16 | +foldingRangeTests = testGroup "FoldingRange minimal tests" |
| 17 | + [ testCase "Field produces collapsed text 'homepage'" $ do |
| 18 | + let field = Field (Name (Cabal.Position 0 0) (C8.pack "homepage")) [] |
| 19 | + case foldingRangeForField field of |
| 20 | + Just LSP.FoldingRange{..} -> |
| 21 | + _collapsedText @?= Just "homepage" |
| 22 | + Nothing -> |
| 23 | + assertFailure "Expected a FoldingRange for field" |
| 24 | + ] |
| 25 | + |
| 26 | +-- {-# LANGUAGE OverloadedStrings #-} |
| 27 | + |
| 28 | +-- module FoldingRange ( |
| 29 | +-- foldingRangeTests, |
| 30 | +-- ) where |
| 31 | + |
| 32 | +-- import Language.LSP.Protocol.Types (Position (..), FoldingRange (..)) |
| 33 | +-- import qualified Test.Hls as T |
| 34 | +-- import Utils |
| 35 | + |
| 36 | +-- defFoldingRange :: Position -> FoldingRange |
| 37 | +-- defFoldingRange (Position line char) = |
| 38 | +-- FoldingRange |
| 39 | +-- { _startLine = line |
| 40 | +-- , _startCharacter = Just char |
| 41 | +-- , _endLine = line |
| 42 | +-- , _endCharacter = Just char |
| 43 | +-- , _kind = Nothing |
| 44 | +-- , _collapsedText = Nothing |
| 45 | +-- } |
| 46 | + |
| 47 | +-- testFoldingRanges :: (T.HasCallStack) |
| 48 | +-- => T.TestName |
| 49 | +-- -> FilePath |
| 50 | +-- -> [FoldingRange] |
| 51 | +-- -> T.TestTree |
| 52 | +-- testFoldingRanges testName path expectedRanges = |
| 53 | +-- runCabalTestCaseSession testName "folding-range-cabal" $ do |
| 54 | +-- docId <- T.openDoc path "cabal" |
| 55 | +-- ranges <- T.getFoldingRanges docId |
| 56 | +-- T.liftIO $ ranges T.@?= Right expectedRanges |
| 57 | + |
| 58 | +-- foldingRangeTests :: T.TestTree |
| 59 | +-- foldingRangeTests = |
| 60 | +-- T.testGroup "Cabal FoldingRange Tests" |
| 61 | +-- [ testFoldingRanges |
| 62 | +-- "cabal Field folding range test" |
| 63 | +-- "field.cabal" |
| 64 | +-- [fieldFoldingRange] |
| 65 | +-- , testFoldingRanges |
| 66 | +-- "cabal FieldLine folding range test" |
| 67 | +-- "fieldline.cabal" |
| 68 | +-- [fieldLineFoldingRange] |
| 69 | +-- , testFoldingRanges |
| 70 | +-- "cabal Section folding range test" |
| 71 | +-- "section.cabal" |
| 72 | +-- [sectionFoldingRange] |
| 73 | +-- , testFoldingRanges |
| 74 | +-- "cabal SectionArg folding range test" |
| 75 | +-- "sectionarg.cabal" |
| 76 | +-- [sectionArgFoldingRange] |
| 77 | +-- ] |
| 78 | + |
| 79 | + |
| 80 | +-- fieldFoldingRange :: FoldingRange |
| 81 | +-- fieldFoldingRange = |
| 82 | +-- (defFoldingRange (Position 0 0)) |
| 83 | +-- { _endLine = 0 |
| 84 | +-- , _endCharacter = Just 8 |
| 85 | +-- , _collapsedText = Just "homepage" |
| 86 | +-- } |
| 87 | + |
| 88 | +-- fieldLineFoldingRange :: FoldingRange |
| 89 | +-- fieldLineFoldingRange = |
| 90 | +-- (defFoldingRange (Position 0 0)) |
| 91 | +-- { _endLine = 0 |
| 92 | +-- , _endCharacter = Just 13 |
| 93 | +-- , _collapsedText = Just "cabal-version" |
| 94 | +-- } |
| 95 | + |
| 96 | +-- sectionFoldingRange :: FoldingRange |
| 97 | +-- sectionFoldingRange = |
| 98 | +-- (defFoldingRange (Position 0 2)) |
| 99 | +-- { _endLine = 0 |
| 100 | +-- , _endCharacter = Just 15 |
| 101 | +-- , _collapsedText = Just "build-depends" |
| 102 | +-- } |
| 103 | + |
| 104 | +-- sectionArgFoldingRange :: FoldingRange |
| 105 | +-- sectionArgFoldingRange = |
| 106 | +-- (defFoldingRange (Position 0 2)) |
| 107 | +-- { _endLine = 1 |
| 108 | +-- , _endCharacter = Just 17 |
| 109 | +-- , _collapsedText = Just "if os(windows)" |
| 110 | +-- } |
| 111 | + |
0 commit comments