-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathhoax_code.erl
52 lines (44 loc) · 1.47 KB
/
hoax_code.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
-module(hoax_code).
-export([
get_export_list/2,
get_callback_list/2,
purge_and_delete/1,
compile/2
]).
-include("hoax_int.hrl").
get_export_list(ModuleName, ExpectedFunctions) ->
case module_exists(ModuleName) of
true ->
[E || E = {F,_} <- ModuleName:module_info(exports), F =/= module_info];
false ->
[ {F, A} || #expectation{key = {_,F,A}} <- ExpectedFunctions ]
end.
get_callback_list(Behaviour, ModuleName) ->
module_exists(ModuleName) andalso
error({module_exists, ModuleName}),
module_exists(Behaviour) orelse
error({no_such_behaviour_to_mock, Behaviour}),
erlang:function_exported(Behaviour, behaviour_info, 1) orelse
error({not_a_behaviour, Behaviour}),
Behaviour:behaviour_info(callbacks).
purge_and_delete(ModuleName) ->
Sticky = code:is_sticky(ModuleName),
code:purge(ModuleName),
code:delete(ModuleName),
code:ensure_loaded(ModuleName),
restore_stickiness(ModuleName, Sticky).
module_exists(ModuleName) ->
case code:ensure_loaded(ModuleName) of
{error, nofile} -> false;
{module, ModuleName} -> true
end.
restore_stickiness(ModuleName, true) ->
code:stick_mod(ModuleName);
restore_stickiness(_, _) ->
ok.
compile(Mod, Forms) ->
Sticky = code:is_sticky(Mod),
{ok, Mod, Bin} = compile:forms(Forms),
code:unstick_mod(Mod),
code:load_binary(Mod, "", Bin),
restore_stickiness(Mod, Sticky).