Skip to content

Commit 4b4d2cb

Browse files
committed
Ensure async property is preserved when not given
1 parent 8321e90 commit 4b4d2cb

File tree

6 files changed

+40
-43
lines changed

6 files changed

+40
-43
lines changed

lib/ex_unit/lib/ex_unit.ex

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -405,14 +405,10 @@ defmodule ExUnit do
405405
@spec run([module()]) :: suite_result()
406406
def run(additional_modules \\ []) do
407407
for module <- additional_modules do
408-
module_attributes = module.__info__(:attributes)
409-
410-
case Keyword.get(module_attributes, :ex_unit_module) do
411-
[config] ->
412-
ExUnit.Server.add_module(module, config)
413-
414-
_ ->
415-
raise(ArgumentError, "#{inspect(module)} is not a ExUnit.Case module")
408+
if Code.ensure_loaded?(module) and function_exported?(module, :__ex_unit__, 1) do
409+
ExUnit.Server.add_module(module, module.__ex_unit__(:config))
410+
else
411+
raise(ArgumentError, "#{inspect(module)} is not a ExUnit.Case module")
416412
end
417413
end
418414

lib/ex_unit/lib/ex_unit/callbacks.ex

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -166,22 +166,21 @@ defmodule ExUnit.Callbacks do
166166
"""
167167

168168
@doc false
169-
defmacro __using__(_) do
170-
quote do
171-
@ex_unit_describe nil
172-
@ex_unit_setup []
173-
@ex_unit_setup_all []
174-
@ex_unit_used_describes %{}
175-
176-
@before_compile unquote(__MODULE__)
177-
import unquote(__MODULE__)
178-
end
169+
def __register__(module) do
170+
Module.put_attribute(module, :ex_unit_describe, nil)
171+
Module.put_attribute(module, :ex_unit_setup, [])
172+
Module.put_attribute(module, :ex_unit_setup_all, [])
173+
Module.put_attribute(module, :ex_unit_used_describes, %{})
179174
end
180175

181176
@doc false
182177
defmacro __before_compile__(env) do
183178
used_describes = Module.get_attribute(env.module, :ex_unit_used_describes)
184-
[compile_setup(env, :setup, used_describes), compile_setup(env, :setup_all, %{})]
179+
180+
quote do
181+
unquote(compile_setup(env, :setup, used_describes))
182+
unquote(compile_setup(env, :setup_all, %{}))
183+
end
185184
end
186185

187186
@doc """

lib/ex_unit/lib/ex_unit/case.ex

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,7 @@ defmodule ExUnit.Case do
299299
@doc false
300300
defmacro __using__(opts) do
301301
quote do
302-
if !ExUnit.Case.__register__(__MODULE__, unquote(opts)) do
303-
use ExUnit.Callbacks
304-
end
302+
ExUnit.Case.__register__(__MODULE__, unquote(opts))
305303

306304
import ExUnit.Callbacks
307305
import ExUnit.Assertions
@@ -319,20 +317,13 @@ defmodule ExUnit.Case do
319317
end
320318

321319
{register?, opts} = Keyword.pop(opts, :register, true)
322-
{async?, opts} = Keyword.pop(opts, :async, false)
323-
{parameterize, opts} = Keyword.pop(opts, :parameterize, nil)
324-
325-
if not (parameterize == nil or (is_list(parameterize) and Enum.all?(parameterize, &is_map/1))) do
326-
raise ArgumentError, ":parameterize must be a list of maps, got: #{inspect(parameterize)}"
327-
end
320+
{next_opts, opts} = Keyword.split(opts, [:async, :parameterize])
328321

329322
if opts != [] do
330323
IO.warn("unknown options given to ExUnit.Case: #{inspect(opts)}")
331324
end
332325

333-
registered? = Module.has_attribute?(module, :ex_unit_tests)
334-
335-
if not registered? do
326+
if not Module.has_attribute?(module, :ex_unit_tests) do
336327
tag_check = Enum.any?([:moduletag, :describetag, :tag], &Module.has_attribute?(module, &1))
337328

338329
if tag_check do
@@ -351,19 +342,18 @@ defmodule ExUnit.Case do
351342

352343
Enum.each(accumulate_attributes, &Module.register_attribute(module, &1, accumulate: true))
353344

354-
persisted_attributes = [:ex_unit_module]
355-
356-
Enum.each(persisted_attributes, &Module.register_attribute(module, &1, persist: true))
357-
358345
if register? do
359346
Module.put_attribute(module, :after_compile, ExUnit.Case)
360347
end
361348

349+
ExUnit.Callbacks.__register__(module)
362350
Module.put_attribute(module, :before_compile, ExUnit.Case)
351+
Module.put_attribute(module, :before_compile, ExUnit.Callbacks)
363352
end
364353

365-
Module.put_attribute(module, :ex_unit_module, {async?, parameterize})
366-
registered?
354+
past_opts = Module.get_attribute(module, :ex_unit_module, [])
355+
Module.put_attribute(module, :ex_unit_module, Keyword.merge(past_opts, next_opts))
356+
:ok
367357
end
368358

369359
@doc """
@@ -560,6 +550,14 @@ defmodule ExUnit.Case do
560550
|> validate_tags()
561551
|> Map.new()
562552

553+
opts = Module.get_attribute(module, :ex_unit_module, [])
554+
async? = Keyword.get(opts, :async, false)
555+
parameterize = Keyword.get(opts, :parameterize, nil)
556+
557+
if not (parameterize == nil or (is_list(parameterize) and Enum.all?(parameterize, &is_map/1))) do
558+
raise ArgumentError, ":parameterize must be a list of maps, got: #{inspect(parameterize)}"
559+
end
560+
563561
quote do
564562
def __ex_unit__ do
565563
%ExUnit.TestModule{
@@ -569,15 +567,18 @@ defmodule ExUnit.Case do
569567
tests: unquote(tests)
570568
}
571569
end
570+
571+
def __ex_unit__(:config) do
572+
{unquote(async?), unquote(Macro.escape(parameterize))}
573+
end
572574
end
573575
end
574576

575577
@doc false
576578
def __after_compile__(%{module: module}, _) do
577579
cond do
578580
Process.whereis(ExUnit.Server) ->
579-
config = Module.get_attribute(module, :ex_unit_module)
580-
ExUnit.Server.add_module(module, config)
581+
ExUnit.Server.add_module(module, module.__ex_unit__(:config))
581582

582583
Code.can_await_module_compilation?() ->
583584
:ok

lib/ex_unit/lib/ex_unit/case_template.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ defmodule ExUnit.CaseTemplate do
6464
@doc false
6565
defmacro __using__(_) do
6666
quote do
67-
use ExUnit.Callbacks
67+
ExUnit.Callbacks.__register__(__MODULE__)
68+
@before_compile ExUnit.Callbacks
69+
import ExUnit.Callbacks
6870

6971
import ExUnit.Assertions
7072
import unquote(__MODULE__)

lib/ex_unit/test/ex_unit/case_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ defmodule ExUnit.DoubleCaseTestAsyncFirst do
167167
use ExUnit.Case
168168

169169
test "async must be true", context do
170-
refute context.async
170+
assert context.async
171171
end
172172
end
173173

lib/ex_unit/test/ex_unit_test.exs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,8 +1141,7 @@ defmodule ExUnitTest do
11411141

11421142
defp run_with_filter(filters, cases) do
11431143
Enum.each(cases, fn mod ->
1144-
[config] = mod.__info__(:attributes) |> Keyword.fetch!(:ex_unit_module)
1145-
ExUnit.Server.add_module(mod, config)
1144+
ExUnit.Server.add_module(mod, mod.__ex_unit__(:config))
11461145
end)
11471146

11481147
ExUnit.Server.modules_loaded(false)

0 commit comments

Comments
 (0)