@@ -376,13 +376,13 @@ defmodule ExUnit.DocTest do
376
376
end ) > 1
377
377
end
378
378
379
- defp test_case_content ( expr , :test , location , stack , doctest ) do
380
- string_to_quoted ( location , stack , expr , doctest ) |> insert_assertions ( )
379
+ defp test_case_content ( expr_lines , :test , location , stack , doctest ) do
380
+ string_to_quoted ( location , stack , expr_lines , doctest ) |> insert_assertions ( )
381
381
end
382
382
383
- defp test_case_content ( expr , { :test , expected } , location , stack , doctest ) do
384
- expr_ast = string_to_quoted ( location , stack , expr , doctest ) |> insert_assertions ( )
385
- expected_ast = string_to_quoted ( location , stack , expected , doctest )
383
+ defp test_case_content ( expr_lines , { :test , expected } , location , stack , doctest ) do
384
+ expr_ast = string_to_quoted ( location , stack , expr_lines , doctest ) |> insert_assertions ( )
385
+ expected_ast = string_to_quoted ( update_line ( location , expr_lines ) , stack , expected , doctest )
386
386
last_expr = Macro . to_string ( last_expr ( expr_ast ) )
387
387
388
388
quote do
@@ -397,8 +397,8 @@ defmodule ExUnit.DocTest do
397
397
end
398
398
end
399
399
400
- defp test_case_content ( expr , { :inspect , expected } , location , stack , doctest ) do
401
- expr_ast = string_to_quoted ( location , stack , expr , doctest ) |> insert_assertions ( )
400
+ defp test_case_content ( expr_lines , { :inspect , expected } , location , stack , doctest ) do
401
+ expr_ast = string_to_quoted ( location , stack , expr_lines , doctest ) |> insert_assertions ( )
402
402
last_expr = Macro . to_string ( last_expr ( expr_ast ) )
403
403
404
404
quote do
@@ -425,6 +425,10 @@ defmodule ExUnit.DocTest do
425
425
end
426
426
end
427
427
428
+ defp update_line ( location , lines ) do
429
+ Keyword . replace_lazy ( location , :line , & & 1 + length ( lines ) )
430
+ end
431
+
428
432
@ doc false
429
433
def __test__ ( value , expected , doctest , last_expr , expected_expr , stack ) do
430
434
case value do
@@ -510,7 +514,7 @@ defmodule ExUnit.DocTest do
510
514
511
515
defp string_to_quoted ( location , stack , expr , doctest ) do
512
516
try do
513
- Code . string_to_quoted! ( expr , location )
517
+ Code . string_to_quoted! ( IO . iodata_to_binary ( expr ) , location )
514
518
rescue
515
519
e ->
516
520
ex_message = "(#{ inspect ( e . __struct__ ) } ) #{ Exception . message ( e ) } "
@@ -591,12 +595,6 @@ defmodule ExUnit.DocTest do
591
595
defp extract_from_doc ( _doc , _module ) ,
592
596
do: [ ]
593
597
594
- defp extract_tests ( line_no , doc , module ) do
595
- all_lines = String . split ( doc , [ "\r \n " , "\n " ] , trim: false )
596
- lines = adjust_indent ( all_lines , line_no + 1 , module )
597
- extract_tests ( lines , "" , "" , [ ] , true , module , "" )
598
- end
599
-
600
598
@ iex_prompt [ "iex>" , "iex(" ]
601
599
@ dot_prompt [ "...>" , "...(" ]
602
600
@@ -696,13 +694,19 @@ defmodule ExUnit.DocTest do
696
694
697
695
@ fences [ "```" , "~~~" ]
698
696
697
+ defp extract_tests ( line_no , doc , module ) do
698
+ all_lines = String . split ( doc , [ "\r \n " , "\n " ] , trim: false )
699
+ lines = adjust_indent ( all_lines , line_no + 1 , module )
700
+ extract_tests ( lines , [ ] , [ ] , [ ] , true , module , [ ] )
701
+ end
702
+
699
703
defp extract_tests ( lines , expr_acc , expected_acc , acc , new_test , module , formatted )
700
704
701
- defp extract_tests ( [ ] , "" , "" , [ ] , _ , _ , _ ) do
705
+ defp extract_tests ( [ ] , [ ] , [ ] , [ ] , _ , _ , _ ) do
702
706
[ ]
703
707
end
704
708
705
- defp extract_tests ( [ ] , "" , "" , acc , _ , _ , _ ) do
709
+ defp extract_tests ( [ ] , [ ] , [ ] , acc , _ , _ , _ ) do
706
710
Enum . reverse ( acc )
707
711
end
708
712
@@ -722,36 +726,36 @@ defmodule ExUnit.DocTest do
722
726
module ,
723
727
formatted
724
728
)
725
- when expr_acc != "" and expected_acc != "" do
729
+ when expr_acc != [ ] and expected_acc != [ ] do
726
730
test = add_expr ( test , expr_acc , expected_acc , formatted )
727
- extract_tests ( list , "" , "" , [ test | rest ] , new_test , module , "" )
731
+ extract_tests ( list , [ ] , [ ] , [ test | rest ] , new_test , module , [ ] )
728
732
end
729
733
730
734
# Store expr_acc and start a new test case.
731
735
defp extract_tests (
732
736
[ { "iex>" <> string = line , line_no } | lines ] ,
733
- "" ,
737
+ [ ] ,
734
738
expected_acc ,
735
739
acc ,
736
740
true ,
737
741
module ,
738
742
_
739
743
) do
740
744
test = % { line: line_no , fun_arity: nil , exprs: [ ] }
741
- extract_tests ( lines , string , expected_acc , [ test | acc ] , false , module , line )
745
+ extract_tests ( lines , [ string ] , expected_acc , [ test | acc ] , false , module , line )
742
746
end
743
747
744
748
# Store expr_acc.
745
749
defp extract_tests (
746
750
[ { "iex>" <> string = line , _ } | lines ] ,
747
- "" ,
751
+ [ ] ,
748
752
expected_acc ,
749
753
acc ,
750
754
false ,
751
755
module ,
752
756
_
753
757
) do
754
- extract_tests ( lines , string , expected_acc , acc , false , module , line )
758
+ extract_tests ( lines , [ string ] , expected_acc , acc , false , module , line )
755
759
end
756
760
757
761
# Still gathering expr_acc. Synonym for the next clause.
@@ -764,15 +768,9 @@ defmodule ExUnit.DocTest do
764
768
module ,
765
769
formatted
766
770
) do
767
- extract_tests (
768
- lines ,
769
- expr_acc <> "\n " <> string ,
770
- expected_acc ,
771
- acc ,
772
- new_test ,
773
- module ,
774
- formatted <> "\n " <> line
775
- )
771
+ expr_acc = add_line ( expr_acc , string )
772
+ formatted = add_line ( formatted , line )
773
+ extract_tests ( lines , expr_acc , expected_acc , acc , new_test , module , formatted )
776
774
end
777
775
778
776
# Still gathering expr_acc. Synonym for the previous clause.
@@ -785,16 +783,10 @@ defmodule ExUnit.DocTest do
785
783
module ,
786
784
formatted
787
785
)
788
- when expr_acc != "" do
789
- extract_tests (
790
- lines ,
791
- expr_acc <> "\n " <> string ,
792
- expected_acc ,
793
- acc ,
794
- new_test ,
795
- module ,
796
- formatted <> "\n " <> line
797
- )
786
+ when expr_acc != [ ] do
787
+ expr_acc = add_line ( expr_acc , string )
788
+ formatted = add_line ( formatted , line )
789
+ extract_tests ( lines , expr_acc , expected_acc , acc , new_test , module , formatted )
798
790
end
799
791
800
792
# Expression numbers are simply skipped.
@@ -826,8 +818,8 @@ defmodule ExUnit.DocTest do
826
818
end
827
819
828
820
# Skip empty or documentation line.
829
- defp extract_tests ( [ _ | lines ] , "" , "" , acc , _ , module , _formatted ) do
830
- extract_tests ( lines , "" , "" , acc , true , module , "" )
821
+ defp extract_tests ( [ _ | lines ] , [ ] , [ ] , acc , _ , module , _formatted ) do
822
+ extract_tests ( lines , [ ] , [ ] , acc , true , module , [ ] )
831
823
end
832
824
833
825
# Encountered end of fenced code block, store pending test
@@ -840,9 +832,9 @@ defmodule ExUnit.DocTest do
840
832
module ,
841
833
formatted
842
834
)
843
- when fence in @ fences and expr_acc != "" do
835
+ when fence in @ fences and expr_acc != [ ] do
844
836
test = add_expr ( test , expr_acc , expected_acc , formatted )
845
- extract_tests ( lines , "" , "" , [ test | rest ] , true , module , "" )
837
+ extract_tests ( lines , [ ] , [ ] , [ test | rest ] , true , module , [ ] )
846
838
end
847
839
848
840
# Encountered an empty line, store pending test
@@ -856,11 +848,11 @@ defmodule ExUnit.DocTest do
856
848
formatted
857
849
) do
858
850
test = add_expr ( test , expr_acc , expected_acc , formatted )
859
- extract_tests ( lines , "" , "" , [ test | rest ] , true , module , "" )
851
+ extract_tests ( lines , [ ] , [ ] , [ test | rest ] , true , module , [ ] )
860
852
end
861
853
862
854
# Finally, parse expected_acc.
863
- defp extract_tests ( [ { expected , _ } | lines ] , expr_acc , "" , acc , new_test , module , formatted ) do
855
+ defp extract_tests ( [ { expected , _ } | lines ] , expr_acc , [ ] , acc , new_test , module , formatted ) do
864
856
extract_tests ( lines , expr_acc , expected , acc , new_test , module , formatted )
865
857
end
866
858
@@ -873,15 +865,12 @@ defmodule ExUnit.DocTest do
873
865
module ,
874
866
formatted
875
867
) do
876
- extract_tests (
877
- lines ,
878
- expr_acc ,
879
- expected_acc <> "\n " <> expected ,
880
- acc ,
881
- new_test ,
882
- module ,
883
- formatted
884
- )
868
+ expected_acc = add_line ( expected_acc , expected )
869
+ extract_tests ( lines , expr_acc , expected_acc , acc , new_test , module , formatted )
870
+ end
871
+
872
+ defp add_line ( acc , line ) do
873
+ [ acc , [ ?\n , line ] ]
885
874
end
886
875
887
876
defp skip_iex_number ( ")>" <> string , _module , _line_no , _line ) do
@@ -903,13 +892,14 @@ defmodule ExUnit.DocTest do
903
892
% { test | fun_arity: fa , exprs: Enum . reverse ( exprs ) }
904
893
end
905
894
906
- defp add_expr ( % { exprs: exprs } = test , expr , expected , formatted ) do
907
- doctest = "\n " <> formatted <> "\n " <> expected
908
- % { test | exprs: [ { expr , tag_expected ( expected ) , doctest } | exprs ] }
895
+ defp add_expr ( % { exprs: exprs } = test , expr_lines , expected_lines , formatted_lines ) do
896
+ expected = IO . iodata_to_binary ( expected_lines )
897
+ doctest = IO . iodata_to_binary ( [ ?\n , formatted_lines , ?\n , expected ] )
898
+ % { test | exprs: [ { expr_lines , tag_expected ( expected ) , doctest } | exprs ] }
909
899
end
910
900
911
- defp tag_expected ( string ) do
912
- case string do
901
+ defp tag_expected ( expected ) do
902
+ case expected do
913
903
"" ->
914
904
:test
915
905
@@ -918,10 +908,10 @@ defmodule ExUnit.DocTest do
918
908
{ :error , Module . concat ( [ mod ] ) , String . trim_leading ( message ) }
919
909
920
910
_ ->
921
- if inspectable? ( string ) do
922
- { :inspect , string }
911
+ if inspectable? ( expected ) do
912
+ { :inspect , expected }
923
913
else
924
- { :test , string }
914
+ { :test , expected }
925
915
end
926
916
end
927
917
end
0 commit comments