@@ -2,6 +2,10 @@ defmodule ExUnit.DuplicateTestError do
2
2
defexception [ :message ]
3
3
end
4
4
5
+ defmodule ExUnit.DuplicateDescribeError do
6
+ defexception [ :message ]
7
+ end
8
+
5
9
defmodule ExUnit.Case do
6
10
@ moduledoc """
7
11
Helpers for defining test cases.
@@ -217,7 +221,7 @@ defmodule ExUnit.Case do
217
221
async = ! ! unquote ( opts ) [ :async ]
218
222
219
223
unless Module . get_attribute ( __MODULE__ , :ex_unit_tests ) do
220
- Enum . each [ :ex_unit_tests , :tag , :describetag , :moduletag , :ex_unit_registered ] ,
224
+ Enum . each [ :ex_unit_tests , :tag , :describetag , :moduletag , :ex_unit_registered , :ex_unit_used_describes ] ,
221
225
& Module . register_attribute ( __MODULE__ , & 1 , accumulate: true )
222
226
223
227
@ before_compile ExUnit.Case
@@ -359,10 +363,19 @@ defmodule ExUnit.Case do
359
363
"for describe/2 on named setups and how to handle hierarchies"
360
364
end
361
365
362
- @ ex_unit_describe ( case unquote ( message ) do
363
- msg when is_binary ( msg ) -> msg
364
- msg -> raise ArgumentError , "describe name must be a string, got: #{ inspect msg } "
365
- end )
366
+ message = unquote ( message )
367
+ cond do
368
+ not is_binary ( message ) ->
369
+ raise ArgumentError , "describe name must be a string, got: #{ inspect ( message ) } "
370
+ message in @ ex_unit_used_describes ->
371
+ raise ExUnit.DuplicateDescribeError ,
372
+ "describe #{ inspect ( message ) } is already defined in #{ inspect ( __MODULE__ ) } "
373
+ true ->
374
+ :ok
375
+ end
376
+
377
+ @ ex_unit_describe message
378
+ @ ex_unit_used_describes message
366
379
Module . delete_attribute ( __ENV__ . module , :describetag )
367
380
368
381
try do
0 commit comments