Skip to content

Commit c22f734

Browse files
committed
Fix non-result doctest terminated with fences, closes #12695
1 parent 858835f commit c22f734

File tree

2 files changed

+20
-41
lines changed

2 files changed

+20
-41
lines changed

lib/ex_unit/lib/ex_unit/doc_test.ex

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -624,57 +624,37 @@ defmodule ExUnit.DocTest do
624624
end
625625
end
626626

627-
defp adjust_indent(kind, [line | rest], line_no, adjusted_lines, indent, module)
628-
when kind in [:prompt, :after_prompt] do
627+
defp adjust_indent(kind, [line | rest], line_no, adjusted_lines, indent, module) do
629628
stripped_line = strip_indent(line, indent)
629+
trimmed_line = String.trim_leading(line)
630630

631-
case String.trim_leading(line) do
632-
"" ->
633-
:ok
634-
635-
^stripped_line ->
636-
:ok
637-
638-
_ ->
639-
n_spaces = if indent == 1, do: "#{indent} space", else: "#{indent} spaces"
631+
if kind != :code and trimmed_line != stripped_line do
632+
n_spaces = if indent == 1, do: "#{indent} space", else: "#{indent} spaces"
640633

641-
raise Error,
642-
line: line_no,
643-
module: module,
644-
message: """
645-
indentation level mismatch on doctest line: #{inspect(line)}
634+
raise Error,
635+
line: line_no,
636+
module: module,
637+
message: """
638+
indentation level mismatch on doctest line: #{inspect(line)}
646639
647-
If you are planning to assert on the result of an `iex>` expression, \
648-
make sure the result is indented at the beginning of `iex>`, which \
649-
in this case is exactly #{n_spaces}.
640+
If you are planning to assert on the result of an `iex>` expression, \
641+
make sure the result is indented at the beginning of `iex>`, which \
642+
in this case is exactly #{n_spaces}.
650643
651-
If instead you have an `iex>` expression that spans over multiple lines, \
652-
please make sure that each line after the first one begins with `...>`.
653-
"""
644+
If instead you have an `iex>` expression that spans over multiple lines, \
645+
please make sure that each line after the first one begins with `...>`.
646+
"""
654647
end
655648

656-
adjusted_lines = [{adjust_prompt(stripped_line, line_no, module), line_no} | adjusted_lines]
657-
658-
next =
659-
cond do
660-
kind == :prompt -> :after_prompt
661-
String.starts_with?(stripped_line, @iex_prompt ++ @dot_prompt) -> :after_prompt
662-
true -> :code
663-
end
664-
665-
adjust_indent(next, rest, line_no + 1, adjusted_lines, indent, module)
666-
end
667-
668-
defp adjust_indent(:code, [line | rest], line_no, adjusted_lines, indent, module) do
669-
stripped_line = strip_indent(line, indent)
670-
671649
cond do
672650
stripped_line == "" or String.starts_with?(stripped_line, @fences) ->
673651
adjusted_lines = [{"", line_no} | adjusted_lines]
674652
adjust_indent(:text, rest, line_no + 1, adjusted_lines, 0, module)
675653

676-
String.starts_with?(String.trim_leading(stripped_line), @iex_prompt) ->
677-
adjust_indent(:prompt, [line | rest], line_no, adjusted_lines, indent, module)
654+
kind == :prompt or String.starts_with?(trimmed_line, @iex_prompt) or
655+
(kind == :maybe_prompt and String.starts_with?(trimmed_line, @dot_prompt)) ->
656+
line = {adjust_prompt(stripped_line, line_no, module), line_no}
657+
adjust_indent(:maybe_prompt, rest, line_no + 1, [line | adjusted_lines], indent, module)
678658

679659
true ->
680660
adjusted_lines = [{stripped_line, line_no} | adjusted_lines]

lib/ex_unit/test/ex_unit/doc_test_test.exs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,7 @@ defmodule ExUnit.DocTestTest.FencedHeredocs do
317317
```
318318
319319
```
320-
iex> 1 + 2
321-
3
320+
iex> 3 = 1 + 2
322321
```
323322
324323
```

0 commit comments

Comments
 (0)