Skip to content

Commit 45271eb

Browse files
lukaszsamsonclaude
andcommitted
test: restore folding-range coverage for delimiters/blocks as end-to-end tests
The `describe "token pairs"` and `describe "special tokens"` blocks were removed in 41fdf45 along with the tokenizer-based FoldingRange.Token/TokenPair/ SpecialToken modules they called directly (`TokenPair.provide_ranges/1` etc.) - folding moved onto the toxic2 AST region pass. Those per-shape assertions were lost, leaving only the coarse "end to end" cases. Re-add coverage for the same structural shapes, but driven through the public `FoldingRange.provide/1` against the AST-based implementation: nested do/end (defmodule/def/if-else), binary `<<>>`, list `[]` / tuple `{}`, map `%{}`, string and charlist heredocs, sigil heredocs, and try/rescue/after blocks. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XRd15BX6wBpZ8ThaNSo232
1 parent d82c97e commit 45271eb

1 file changed

Lines changed: 111 additions & 0 deletions

File tree

apps/language_server/test/providers/folding_range_test.exs

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,117 @@ defmodule ElixirLS.LanguageServer.Providers.FoldingRangeTest do
263263
end
264264
end
265265

266+
# End-to-end coverage for the structural shapes that used to be unit-tested against the deleted
267+
# tokenizer passes (`FoldingRange.Token`/`TokenPair`/`SpecialToken`). They are now produced by the
268+
# AST region pass off toxic2 node ranges, so they are asserted through the public `provide/1`.
269+
describe "end to end delimiters and blocks" do
270+
setup [:fold_text]
271+
272+
@tag text: """
273+
defmodule A do # 0
274+
def f(x) do # 1
275+
if x do # 2
276+
:ok # 3
277+
else # 4
278+
:err # 5
279+
end # 6
280+
end # 7
281+
end # 8
282+
"""
283+
test "do/end blocks nest (defmodule, def, if/else)", %{
284+
ranges_result: ranges_result,
285+
text: text
286+
} do
287+
assert {:ok, ranges} = ranges_result
288+
expected = [{0, 7, "region"}, {1, 6, "region"}, {2, 5, "region"}, {4, 5, "region"}]
289+
assert compare_condensed_ranges(ranges, expected, text)
290+
end
291+
292+
@tag text: """
293+
x = # 0
294+
<< # 1
295+
1, # 2
296+
2, # 3
297+
3 # 4
298+
>> # 5
299+
"""
300+
test "binary <<>> delimiters fold", %{ranges_result: ranges_result, text: text} do
301+
assert {:ok, ranges} = ranges_result
302+
assert compare_condensed_ranges(ranges, [{1, 4, "region"}], text)
303+
end
304+
305+
@tag text: """
306+
x = [ # 0
307+
1, # 1
308+
2 # 2
309+
] # 3
310+
311+
y = { # 5
312+
:a, # 6
313+
:b # 7
314+
} # 8
315+
"""
316+
test "list [] and tuple {} delimiters fold", %{ranges_result: ranges_result, text: text} do
317+
assert {:ok, ranges} = ranges_result
318+
assert compare_condensed_ranges(ranges, [{0, 2, "region"}, {5, 7, "region"}], text)
319+
end
320+
321+
@tag text: """
322+
m = %{ # 0
323+
a: 1, # 1
324+
b: 2 # 2
325+
} # 3
326+
"""
327+
test "map %{} delimiters fold", %{ranges_result: ranges_result, text: text} do
328+
assert {:ok, ranges} = ranges_result
329+
assert compare_condensed_ranges(ranges, [{0, 2, "region"}], text)
330+
end
331+
332+
@tag text: """
333+
s = \"\"\" # 0
334+
string one # 1
335+
string two # 2
336+
\"\"\"
337+
338+
c = ''' # 5
339+
charlist one # 6
340+
charlist two # 7
341+
'''
342+
"""
343+
test "string and charlist heredocs fold", %{ranges_result: ranges_result, text: text} do
344+
assert {:ok, ranges} = ranges_result
345+
assert compare_condensed_ranges(ranges, [{0, 2, "region"}, {5, 7, "region"}], text)
346+
end
347+
348+
@tag text: """
349+
x = ~S\"\"\" # 0
350+
no \#{interp} # 1
351+
raw # 2
352+
\"\"\"
353+
"""
354+
test "sigil heredoc folds", %{ranges_result: ranges_result, text: text} do
355+
assert {:ok, ranges} = ranges_result
356+
assert compare_condensed_ranges(ranges, [{0, 2, "region"}], text)
357+
end
358+
359+
@tag text: """
360+
def f do # 0
361+
try do # 1
362+
risky() # 2
363+
rescue # 3
364+
e -> handle(e) # 4
365+
after # 5
366+
cleanup() # 6
367+
end # 7
368+
end # 8
369+
"""
370+
test "try/rescue/after blocks fold", %{ranges_result: ranges_result, text: text} do
371+
assert {:ok, ranges} = ranges_result
372+
expected = [{0, 7, "region"}, {1, 6, "region"}, {3, 4, "region"}, {5, 6, "region"}]
373+
assert compare_condensed_ranges(ranges, expected, text)
374+
end
375+
end
376+
266377
defp compare_condensed_ranges(result, expected_condensed, text) do
267378
result_condensed =
268379
result

0 commit comments

Comments
 (0)