Skip to content

Commit 8e0f362

Browse files
committed
Include doctest_data in doctest tags
1 parent 491cf4f commit 8e0f362

File tree

3 files changed

+49
-20
lines changed

3 files changed

+49
-20
lines changed

lib/ex_unit/lib/ex_unit/case.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ defmodule ExUnit.Case do
165165
166166
* `:doctest_line` - the line the doctest was defined (if a doctest)
167167
168+
* `:doctest_data` - additional metadata about doctests (if a doctest)
169+
168170
The following tags customize how tests behave:
169171
170172
* `:capture_log` - see the "Log Capture" section below

lib/ex_unit/lib/ex_unit/doc_test.ex

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ defmodule ExUnit.DocTest do
360360
end
361361

362362
defp test_tags(test, tags) do
363-
[doctest_line: test.line] ++ tags
363+
[doctest_line: test.line, doctest_data: %{end_line: test.end_line}] ++ tags
364364
end
365365

366366
defp multiple_exceptions?(exprs) do
@@ -608,8 +608,8 @@ defmodule ExUnit.DocTest do
608608
adjust_indent(:text, lines, line_no, [], 0, module)
609609
end
610610

611-
defp adjust_indent(_kind, [], _line_no, adjusted_lines, _indent, _module) do
612-
Enum.reverse(adjusted_lines)
611+
defp adjust_indent(_kind, [], line_no, adjusted_lines, _indent, _module) do
612+
{Enum.reverse(adjusted_lines), line_no - 1}
613613
end
614614

615615
defp adjust_indent(:text, [line | rest], line_no, adjusted_lines, indent, module) do
@@ -720,14 +720,14 @@ defmodule ExUnit.DocTest do
720720
end
721721
end
722722

723-
defp chunk_tests(lines, acc) do
723+
defp chunk_tests(lines, acc, last_no) do
724724
case lines
725725
|> Enum.drop_while(&(not test_started?(&1)))
726726
|> Enum.split_while(&(not test_finished?(&1))) do
727727
{[], []} -> Enum.reverse(acc)
728-
{test, []} -> Enum.reverse([test | acc])
729-
{[], [_empty_line | lines]} -> chunk_tests(lines, acc)
730-
{test, [_empty_line | lines]} -> chunk_tests(lines, [test | acc])
728+
{chunk, []} -> Enum.reverse([{chunk, last_no} | acc])
729+
{[], [_empty_line | lines]} -> chunk_tests(lines, acc, last_no)
730+
{chunk, [{_, line_no} | lines]} -> chunk_tests(lines, [{chunk, line_no} | acc], last_no)
731731
end
732732
end
733733

@@ -744,16 +744,19 @@ defmodule ExUnit.DocTest do
744744
end
745745

746746
defp extract_tests(line_no, doc, module, fun_arity) do
747-
doc
748-
|> String.split(["\r\n", "\n"], trim: false)
749-
|> adjust_indent(line_no + 1, module)
750-
|> chunk_tests([])
747+
{lines, last_line} =
748+
doc
749+
|> String.split(["\r\n", "\n"], trim: false)
750+
|> adjust_indent(line_no + 1, module)
751+
752+
lines
753+
|> chunk_tests([], last_line)
751754
|> Enum.map(&build_test(&1, fun_arity))
752755
end
753756

754-
defp build_test([{"iex>" <> string = line, line_no} | lines], fun_arity) do
757+
defp build_test({[{"iex>" <> string = line, line_no} | lines], end_line_no}, fun_arity) do
755758
exprs = build_test(lines, [string], [], [line], [], line_no)
756-
%{line: line_no, exprs: Enum.reverse(exprs), fun_arity: fun_arity}
759+
%{line: line_no, end_line: end_line_no - 1, exprs: Enum.reverse(exprs), fun_arity: fun_arity}
757760
end
758761

759762
# Started a new expression.

lib/ex_unit/test/ex_unit/doc_test_test.exs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@ defmodule ExUnit.DocTestTest.GoodModule do
3434
"""
3535
def test_sigil, do: :ok
3636

37-
@doc " iex>1 + 2\n 3"
38-
def no_trailing_new_line, do: :ok
39-
4037
@doc """
4138
iex> a = 1
4239
iex> b = a + 2
@@ -136,6 +133,12 @@ defmodule ExUnit.DocTestTest.NoImport do
136133
end
137134
|> ExUnit.BeamHelpers.write_beam()
138135

136+
defmodule ExUnit.DocTestTest.NoTrailing do
137+
@doc " iex>1 + 2\n 3"
138+
def no_trailing_new_line, do: :ok
139+
end
140+
|> ExUnit.BeamHelpers.write_beam()
141+
139142
defmodule ExUnit.DocTestTest.Failure do
140143
def starting_line, do: __ENV__.line + 2
141144

@@ -490,6 +493,7 @@ defmodule ExUnit.DocTestTest do
490493
# doctest ExUnit.DocTest
491494

492495
doctest ExUnit.DocTestTest.GoodModule, import: true
496+
doctest ExUnit.DocTestTest.NoTrailing
493497

494498
doctest ExUnit.DocTestTest.SomewhatGoodModuleWithOnly,
495499
only: [:moduledoc, one: 0],
@@ -957,16 +961,36 @@ defmodule ExUnit.DocTestTest do
957961
end
958962

959963
test "doctests built-in tags" do
960-
alias ExUnit.DocTestTest.NoImport
964+
alias ExUnit.DocTestTest.{NoImport, NoTrailing}
961965

962966
defmodule DoctestTags do
963967
use ExUnit.Case, register: false
964968
doctest NoImport
969+
doctest NoTrailing
965970
end
966971

967-
assert %ExUnit.TestModule{tests: [test1, test2]} = DoctestTags.__ex_unit__()
968-
assert %{test_type: :doctest, doctest: NoImport, doctest_line: 129} = test1.tags
969-
assert %{test_type: :doctest, doctest: NoImport, doctest_line: 132} = test2.tags
972+
assert %ExUnit.TestModule{tests: [test1, test2, test3]} = DoctestTags.__ex_unit__()
973+
974+
assert %{
975+
test_type: :doctest,
976+
doctest: NoImport,
977+
doctest_line: 126,
978+
doctest_data: %{end_line: 127}
979+
} = test1.tags
980+
981+
assert %{
982+
test_type: :doctest,
983+
doctest: NoImport,
984+
doctest_line: 129,
985+
doctest_data: %{end_line: 130}
986+
} = test2.tags
987+
988+
assert %{
989+
test_type: :doctest,
990+
doctest: NoTrailing,
991+
doctest_line: 138,
992+
doctest_data: %{end_line: 138}
993+
} = test3.tags
970994
end
971995

972996
describe "errors" do

0 commit comments

Comments
 (0)