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)),