Merge pull request #102 from campanja/expect-improper-list
Support meck:expect with improper list mock data
diff --git a/src/meck_code_gen.erl b/src/meck_code_gen.erl
index c09d400..68b350c 100644
--- a/src/meck_code_gen.erl
+++ b/src/meck_code_gen.erl
@@ -116,12 +116,22 @@
is_reference(Term) ->
true;
contains_opaque(Term) when is_list(Term) ->
- lists:any(fun contains_opaque/1, Term);
+ lists_any(fun contains_opaque/1, Term);
contains_opaque(Term) when is_tuple(Term) ->
- lists:any(fun contains_opaque/1, tuple_to_list(Term));
+ lists_any(fun contains_opaque/1, tuple_to_list(Term));
contains_opaque(_Term) ->
false.
+%% based on lists.erl but accepts improper lists.
+lists_any(Pred, []) when is_function(Pred, 1) -> false;
+lists_any(Pred, [Hd|Tail]) ->
+ case Pred(Hd) of
+ true -> true;
+ false -> lists_any(Pred, Tail)
+ end;
+lists_any(Pred, Improper) ->
+ Pred(Improper).
+
args(0) -> [];
args(Arity) -> [?var(var_name(N)) || N <- lists:seq(1, Arity)].
diff --git a/test/meck_tests.erl b/test/meck_tests.erl
index b6d237f..9d2b37c 100644
--- a/test/meck_tests.erl
+++ b/test/meck_tests.erl
@@ -30,6 +30,7 @@
fun ?MODULE:expect_/1,
fun ?MODULE:exports_/1,
fun ?MODULE:call_return_value_/1,
+ fun ?MODULE:call_return_value_improper_list_/1,
fun ?MODULE:call_argument_/1,
fun ?MODULE:call_undef_/1,
fun ?MODULE:call_function_clause_/1,
@@ -146,6 +147,12 @@
?assertEqual(apa, Mod:test()),
?assertEqual(true, meck:validate(Mod)).
+call_return_value_improper_list_(Mod) ->
+ Dict = dict:store(hest, apa, dict:new()),
+ ok = meck:expect(Mod, test, 0, Dict),
+ ?assertEqual(Dict, Mod:test()),
+ ?assertEqual(true, meck:validate(Mod)).
+
call_argument_(Mod) ->
ok = meck:expect(Mod, test, fun(hest, 1) -> apa end),
?assertEqual(apa, Mod:test(hest, 1)),