Skip to content

Commit 5aa97ce

Browse files
authored
fix: don't remove behaviour_info/1 from behaviour modules (#105)
1 parent 12bdaef commit 5aa97ce

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

lib/mimic/module.ex

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ defmodule Mimic.Module do
119119
mimic_functions = generate_mimic_functions(module)
120120
mimic_macros = generate_mimic_macros(module)
121121
mimic_struct = generate_mimic_struct(module)
122+
122123
quoted = [mimic_info, mimic_struct | mimic_behaviours ++ mimic_functions ++ mimic_macros]
124+
123125
Module.create(module, quoted, Macro.Env.location(__ENV__))
124126
module
125127
end
@@ -175,16 +177,11 @@ defmodule Mimic.Module do
175177

176178
defp generate_mimic_functions(module) do
177179
internal_functions = [__info__: 1, module_info: 0, module_info: 1]
178-
179-
functions =
180-
if function_exported?(module, :__info__, 1) do
181-
module.__info__(:functions)
182-
else
183-
module.module_info(:exports)
184-
end
180+
macro_functions = macro_functions(module)
181+
functions = module.module_info(:exports)
185182

186183
for {fn_name, arity} <- functions,
187-
{fn_name, arity} not in internal_functions do
184+
{fn_name, arity} not in (internal_functions ++ macro_functions) do
188185
args = Macro.generate_arguments(arity, module)
189186

190187
quote do
@@ -195,6 +192,16 @@ defmodule Mimic.Module do
195192
end
196193
end
197194

195+
defp macro_functions(module) do
196+
if function_exported?(module, :__info__, 1) do
197+
:macros
198+
|> module.__info__()
199+
|> Enum.map(fn {name, arity} -> {String.to_atom("MACRO-#{name}"), arity + 1} end)
200+
else
201+
[]
202+
end
203+
end
204+
198205
defp generate_mimic_macros(module) do
199206
macros =
200207
if function_exported?(module, :__info__, 1) do

test/mimic_test.exs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,6 +1006,8 @@ defmodule Mimic.Test do
10061006
end
10071007

10081008
describe "behaviours" do
1009+
setup :set_mimic_private
1010+
10091011
test "copies behaviour attributes" do
10101012
behaviours =
10111013
Calculator.module_info(:attributes)
@@ -1015,6 +1017,15 @@ defmodule Mimic.Test do
10151017
assert AddAdapter in behaviours
10161018
assert MultAdapter in behaviours
10171019
end
1020+
1021+
test "Regression test for PR #105: doesn't remove behaviour_info/1" do
1022+
Mimic.copy(MultAdapter)
1023+
1024+
stub(MultAdapter)
1025+
expect(MultAdapter, :behaviour_info, fn :callbacks -> [mult: 2] end)
1026+
1027+
assert MultAdapter.behaviour_info(:callbacks) == [mult: 2]
1028+
end
10181029
end
10191030

10201031
describe "copy/1 with duplicates" do

0 commit comments

Comments
 (0)