aboutsummaryrefslogtreecommitdiffstats
path: root/lib/eunit/src/eunit_data.erl
diff options
context:
space:
mode:
authorRichard Carlsson <richardc@klarna.com>2012-04-17 15:21:05 +0200
committerFredrik Gustafsson <fredrik@erlang.org>2012-08-10 10:57:22 +0200
commit1a90915b4305afb9ee097e03c8a40b3ff5f8e33d (patch)
treed839e15e924614e5c91d8637434bc875c86d8b75 /lib/eunit/src/eunit_data.erl
parente2aaefc509b52eaeb0416ecc603806f1416c17ea (diff)
downloadotp-1a90915b4305afb9ee097e03c8a40b3ff5f8e33d.tar.gz
otp-1a90915b4305afb9ee097e03c8a40b3ff5f8e33d.tar.bz2
otp-1a90915b4305afb9ee097e03c8a40b3ff5f8e33d.zip
detect and report bad return values from generators and instantiators
Diffstat (limited to 'lib/eunit/src/eunit_data.erl')
-rw-r--r--lib/eunit/src/eunit_data.erl21
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/eunit/src/eunit_data.erl b/lib/eunit/src/eunit_data.erl
index 392d378a0e..da66864439 100644
--- a/lib/eunit/src/eunit_data.erl
+++ b/lib/eunit/src/eunit_data.erl
@@ -156,7 +156,8 @@ iter_prev(#iter{prev = [T | Ts]} = I) ->
%% @spec (tests()) -> none | {testItem(), tests()}
%% @type testItem() = #test{} | #group{}
%% @throws {bad_test, term()}
-%% | {generator_failed, exception()}
+%% | {generator_failed, {{M::atom(),F::atom(),A::integer()},
+%% exception()}}
%% | {no_such_function, eunit_lib:mfa()}
%% | {module_not_found, moduleName()}
%% | {application_not_found, appName()}
@@ -221,17 +222,27 @@ parse({foreachx, P, S1, C1, Ps} = T)
[] ->
{data, []}
end;
-parse({generator, F} = T) when is_function(F) ->
+parse({generator, F}) when is_function(F) ->
+ {module, M} = erlang:fun_info(F, module),
+ {name, N} = erlang:fun_info(F, name),
+ {arity, A} = erlang:fun_info(F, arity),
+ parse({generator, F, {M,N,A}});
+parse({generator, F, {M,N,A}} = T)
+ when is_function(F), is_atom(M), is_atom(N), is_integer(A) ->
check_arity(F, 0, T),
%% use run_testfun/1 to handle wrapper exceptions
case eunit_test:run_testfun(F) of
{ok, T1} ->
+ case eunit_lib:is_not_test(T1) of
+ true -> throw({bad_generator, {{M,N,A}, T1}});
+ false -> ok
+ end,
{data, T1};
{error, {Class, Reason, Trace}} ->
- throw({generator_failed, {Class, Reason, Trace}})
+ throw({generator_failed, {{M,N,A}, {Class, Reason, Trace}}})
end;
parse({generator, M, F}) when is_atom(M), is_atom(F) ->
- parse({generator, eunit_test:function_wrapper(M, F)});
+ parse({generator, eunit_test:mf_wrapper(M, F), {M,F,0}});
parse({inorder, T}) ->
group(#group{tests = T, order = inorder});
parse({inparallel, T}) ->
@@ -422,7 +433,7 @@ parse_function(F) when is_function(F) ->
check_arity(F, 0, F),
#test{f = F, location = eunit_lib:fun_parent(F)};
parse_function({M,F}) when is_atom(M), is_atom(F) ->
- #test{f = eunit_test:function_wrapper(M, F), location = {M, F, 0}};
+ #test{f = eunit_test:mf_wrapper(M, F), location = {M, F, 0}};
parse_function(F) ->
bad_test(F).