Skip to content

Commit d5f3a0a

Browse files
eksperimentaljosevalim
authored andcommitted
Raise on doctests that don't finish on a trailing new line (#6180)
1 parent 0a21171 commit d5f3a0a

File tree

2 files changed

+56
-30
lines changed

2 files changed

+56
-30
lines changed

lib/ex_unit/lib/ex_unit/doc_test.ex

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,10 @@ defmodule ExUnit.DocTest do
438438
adjust_indent(:text, lines, line_no, [], 0, module)
439439
end
440440

441+
defp adjust_indent(:after_prompt, [], line_no, _adjusted_lines, _indent, module) do
442+
raise_incomplete_doctest(line_no, module)
443+
end
444+
441445
defp adjust_indent(_kind, [], _line_no, adjusted_lines, _indent, _module) do
442446
Enum.reverse adjusted_lines
443447
end
@@ -457,8 +461,7 @@ defmodule ExUnit.DocTest do
457461

458462
case String.trim_leading(line) do
459463
"" ->
460-
raise Error, line: line_no, module: module,
461-
message: "expected non-blank line to follow iex> prompt"
464+
raise_incomplete_doctest(line_no, module)
462465
^stripped_line ->
463466
:ok
464467
_ ->
@@ -651,4 +654,9 @@ defmodule ExUnit.DocTest do
651654
do: true
652655
defp is_inspected_end?(_),
653656
do: false
657+
658+
defp raise_incomplete_doctest(line_no, module) do
659+
raise Error, line: line_no, module: module,
660+
message: "expected non-blank line to follow iex> prompt"
661+
end
654662
end

lib/ex_unit/test/ex_unit/doc_test_test.exs

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ defmodule ExUnit.DocTestTest.GoodModule do
1717
"""
1818
def test_sigil, do: :ok
1919

20+
@doc " iex>1 + 2\n 3"
21+
def no_trailing_new_line, do: :ok
22+
2023
@doc """
2124
iex> a = 1
2225
iex> b = a + 2
@@ -265,6 +268,11 @@ defmodule ExUnit.DocTestTest.Incomplete do
265268
def test_fun, do: :ok
266269
end |> write_beam
267270

271+
defmodule ExUnit.DocTestTest.IncompleteNoTrailingNewLine do
272+
@doc "iex> 3 + 4"
273+
def test_fun, do: :ok
274+
end |> write_beam
275+
268276
defmodule ExUnit.DocTestTest.FenceIncomplete do
269277
@doc ~S'''
270278
```
@@ -400,112 +408,112 @@ defmodule ExUnit.DocTestTest do
400408

401409
assert output =~ """
402410
1) test moduledoc at ExUnit.DocTestTest.Invalid (1) (ExUnit.DocTestTest.ActuallyCompiled)
403-
test/ex_unit/doc_test_test.exs:391
404-
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:130: syntax error before: '*'
411+
test/ex_unit/doc_test_test.exs:399
412+
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:133: syntax error before: '*'
405413
code: 1 + * 1
406414
stacktrace:
407-
test/ex_unit/doc_test_test.exs:130: ExUnit.DocTestTest.Invalid (module)
415+
test/ex_unit/doc_test_test.exs:133: ExUnit.DocTestTest.Invalid (module)
408416
"""
409417

410418
assert output =~ """
411419
2) test moduledoc at ExUnit.DocTestTest.Invalid (2) (ExUnit.DocTestTest.ActuallyCompiled)
412-
test/ex_unit/doc_test_test.exs:391
420+
test/ex_unit/doc_test_test.exs:399
413421
Doctest failed
414422
code: 1 + hd(List.flatten([1])) === 3
415423
left: 2
416424
stacktrace:
417-
test/ex_unit/doc_test_test.exs:133: ExUnit.DocTestTest.Invalid (module)
425+
test/ex_unit/doc_test_test.exs:136: ExUnit.DocTestTest.Invalid (module)
418426
"""
419427

420428
assert output =~ """
421429
3) test moduledoc at ExUnit.DocTestTest.Invalid (3) (ExUnit.DocTestTest.ActuallyCompiled)
422-
test/ex_unit/doc_test_test.exs:391
430+
test/ex_unit/doc_test_test.exs:399
423431
Doctest failed
424432
code: inspect(:oops) === "#MapSet<[]>"
425433
left: ":oops"
426434
stacktrace:
427-
test/ex_unit/doc_test_test.exs:136: ExUnit.DocTestTest.Invalid (module)
435+
test/ex_unit/doc_test_test.exs:139: ExUnit.DocTestTest.Invalid (module)
428436
"""
429437

430438
# The stacktrace points to the cause of the error
431439
assert output =~ """
432440
4) test moduledoc at ExUnit.DocTestTest.Invalid (4) (ExUnit.DocTestTest.ActuallyCompiled)
433-
test/ex_unit/doc_test_test.exs:391
441+
test/ex_unit/doc_test_test.exs:399
434442
Doctest failed: got UndefinedFunctionError with message "function Hello.world/0 is undefined (module Hello is not available)"
435443
code: Hello.world
436444
stacktrace:
437445
Hello.world()
438-
(for doctest at) test/ex_unit/doc_test_test.exs:139: (test)
446+
(for doctest at) test/ex_unit/doc_test_test.exs:142: (test)
439447
"""
440448

441449
assert output =~ """
442450
5) test moduledoc at ExUnit.DocTestTest.Invalid (5) (ExUnit.DocTestTest.ActuallyCompiled)
443-
test/ex_unit/doc_test_test.exs:391
451+
test/ex_unit/doc_test_test.exs:399
444452
Doctest failed: expected exception WhatIsThis but got RuntimeError with message "oops"
445453
code: raise "oops"
446454
stacktrace:
447-
test/ex_unit/doc_test_test.exs:142: ExUnit.DocTestTest.Invalid (module)
455+
test/ex_unit/doc_test_test.exs:145: ExUnit.DocTestTest.Invalid (module)
448456
"""
449457

450458
assert output =~ """
451459
6) test moduledoc at ExUnit.DocTestTest.Invalid (6) (ExUnit.DocTestTest.ActuallyCompiled)
452-
test/ex_unit/doc_test_test.exs:391
460+
test/ex_unit/doc_test_test.exs:399
453461
Doctest failed: wrong message for RuntimeError
454462
expected:
455463
"hello"
456464
actual:
457465
"oops"
458466
code: raise "oops"
459467
stacktrace:
460-
test/ex_unit/doc_test_test.exs:145: ExUnit.DocTestTest.Invalid (module)
468+
test/ex_unit/doc_test_test.exs:148: ExUnit.DocTestTest.Invalid (module)
461469
"""
462470

463471
assert output =~ """
464472
7) test doc at ExUnit.DocTestTest.Invalid.a/0 (7) (ExUnit.DocTestTest.ActuallyCompiled)
465-
test/ex_unit/doc_test_test.exs:391
466-
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:151: syntax error before: '*'
473+
test/ex_unit/doc_test_test.exs:399
474+
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:154: syntax error before: '*'
467475
code: 1 + * 1
468476
stacktrace:
469-
test/ex_unit/doc_test_test.exs:151: ExUnit.DocTestTest.Invalid (module)
477+
test/ex_unit/doc_test_test.exs:154: ExUnit.DocTestTest.Invalid (module)
470478
"""
471479

472480
assert output =~ """
473481
8) test doc at ExUnit.DocTestTest.Invalid.b/0 (8) (ExUnit.DocTestTest.ActuallyCompiled)
474-
test/ex_unit/doc_test_test.exs:391
475-
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:157: syntax error before: '*'
482+
test/ex_unit/doc_test_test.exs:399
483+
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:160: syntax error before: '*'
476484
code: 1 + * 1
477485
stacktrace:
478-
test/ex_unit/doc_test_test.exs:157: ExUnit.DocTestTest.Invalid (module)
486+
test/ex_unit/doc_test_test.exs:160: ExUnit.DocTestTest.Invalid (module)
479487
"""
480488

481489
assert output =~ """
482490
9) test doc at ExUnit.DocTestTest.Invalid.dedented_past_fence/0 (9) (ExUnit.DocTestTest.ActuallyCompiled)
483-
test/ex_unit/doc_test_test.exs:391
484-
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:181: unexpected token: "`" (column 5, codepoint U+0060)
491+
test/ex_unit/doc_test_test.exs:399
492+
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:184: unexpected token: "`" (column 5, codepoint U+0060)
485493
code: 3
486494
```
487495
stacktrace:
488-
test/ex_unit/doc_test_test.exs:180: ExUnit.DocTestTest.Invalid (module)
496+
test/ex_unit/doc_test_test.exs:183: ExUnit.DocTestTest.Invalid (module)
489497
"""
490498

491499
assert output =~ """
492500
10) test doc at ExUnit.DocTestTest.Invalid.indented_not_enough/0 (10) (ExUnit.DocTestTest.ActuallyCompiled)
493-
test/ex_unit/doc_test_test.exs:391
494-
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:165: unexpected token: "`" (column 1, codepoint U+0060)
501+
test/ex_unit/doc_test_test.exs:399
502+
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:168: unexpected token: "`" (column 1, codepoint U+0060)
495503
code: 3
496504
`
497505
stacktrace:
498-
test/ex_unit/doc_test_test.exs:164: ExUnit.DocTestTest.Invalid (module)
506+
test/ex_unit/doc_test_test.exs:167: ExUnit.DocTestTest.Invalid (module)
499507
"""
500508

501509
assert output =~ """
502510
11) test doc at ExUnit.DocTestTest.Invalid.indented_too_much/0 (11) (ExUnit.DocTestTest.ActuallyCompiled)
503-
test/ex_unit/doc_test_test.exs:391
504-
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:173: unexpected token: "`" (column 3, codepoint U+0060)
511+
test/ex_unit/doc_test_test.exs:399
512+
Doctest did not compile, got: (SyntaxError) test/ex_unit/doc_test_test.exs:176: unexpected token: "`" (column 3, codepoint U+0060)
505513
code: 3
506514
```
507515
stacktrace:
508-
test/ex_unit/doc_test_test.exs:172: ExUnit.DocTestTest.Invalid (module)
516+
test/ex_unit/doc_test_test.exs:175: ExUnit.DocTestTest.Invalid (module)
509517
"""
510518
end
511519

@@ -611,6 +619,16 @@ defmodule ExUnit.DocTestTest do
611619
end
612620
end
613621

622+
test "fails with improper termination not ending in new line" do
623+
assert_raise ExUnit.DocTest.Error,
624+
~r[test/ex_unit/doc_test_test\.exs:\d+: expected non-blank line to follow iex> prompt], fn ->
625+
defmodule NeverCompiled do
626+
import ExUnit.DocTest
627+
doctest ExUnit.DocTestTest.IncompleteNoTrailingNewLine
628+
end
629+
end
630+
end
631+
614632
test "fails on invalid use" do
615633
assert_raise RuntimeError, ~r"cannot define test", fn ->
616634
defmodule FunctionClashFail do

0 commit comments

Comments
 (0)