diff options
| author | alisdair sullivan <alisdairsullivan@yahoo.ca> | 2016-01-17 14:49:39 -0800 | 
|---|---|---|
| committer | alisdair sullivan <alisdairsullivan@yahoo.ca> | 2016-01-17 14:49:39 -0800 | 
| commit | a8dc8ce6e682481aa8178f5cac0ad711e432eaed (patch) | |
| tree | 0789a46b6cf291efec8e6cbfb8280df76f43477e /src | |
| parent | ec7245b454a43205eebc51728672d7a940434e58 (diff) | |
deduplicate default test set generated by `rebar3 eunit`
this ONLY attempts to deduplicate test sets that are generated by
rebar in the absence of any user specified tests
Diffstat (limited to 'src')
| -rw-r--r-- | src/rebar_prv_eunit.erl | 49 | 
1 files changed, 39 insertions, 10 deletions
| diff --git a/src/rebar_prv_eunit.erl b/src/rebar_prv_eunit.erl index 78412d0..a1a4408 100644 --- a/src/rebar_prv_eunit.erl +++ b/src/rebar_prv_eunit.erl @@ -153,22 +153,51 @@ select_tests(_State, _ProjectApps, [], Tests)  -> {ok, Tests};  select_tests(_State, _ProjectApps, Tests, _) -> {ok, Tests}.  default_tests(State, Apps) -> -    Tests = set_apps(Apps, []), -    BareTest = filename:join([rebar_state:dir(State), "test"]), -    F = fun(App) -> rebar_app_info:dir(App) == rebar_state:dir(State) end, -    case filelib:is_dir(BareTest) andalso not lists:any(F, Apps) of -        %% `test` dir at root of project is already scheduled to be -        %%  included or `test` does not exist -        false -> lists:reverse(Tests); -        %% need to add `test` dir at root to dirs to be included -        true  -> lists:reverse([{dir, BareTest}|Tests]) -    end. +    %% use `{application, App}` for each app in project +    AppTests = set_apps(Apps), +    %% additional test modules in `test` dir of each app +    ModTests = set_modules(Apps, State), +    AppTests ++ ModTests. + +set_apps(Apps) -> set_apps(Apps, []).  set_apps([], Acc) -> Acc;  set_apps([App|Rest], Acc) ->      AppName = list_to_atom(binary_to_list(rebar_app_info:name(App))),      set_apps(Rest, [{application, AppName}|Acc]). +set_modules(Apps, State) -> set_modules(Apps, State, {[], []}). + +set_modules([], State, {AppAcc, TestAcc}) -> +    TestSrc = gather_src([filename:join([rebar_state:dir(State), "test"])]), +    dedupe_tests({AppAcc, TestAcc ++ TestSrc}); +set_modules([App|Rest], State, {AppAcc, TestAcc}) -> +    F = fun(Dir) -> filename:join([rebar_app_info:dir(App), Dir]) end, +    AppDirs = lists:map(F, rebar_dir:src_dirs(rebar_app_info:opts(App), ["src"])), +    AppSrc = gather_src(AppDirs), +    TestDirs = [filename:join([rebar_app_info:dir(App), "test"])], +    TestSrc = gather_src(TestDirs), +    set_modules(Rest, State, {AppSrc ++ AppAcc, TestSrc ++ TestAcc}). + +gather_src(Dirs) -> gather_src(Dirs, []). + +gather_src([], Srcs) -> Srcs; +gather_src([Dir|Rest], Srcs) -> +    gather_src(Rest, Srcs ++ rebar_utils:find_files(Dir, "^[^._].*\\.erl\$", true)). + +dedupe_tests({AppMods, TestMods}) -> +    %% for each modules in TestMods create a test if there is not a module +    %% in AppMods that will trigger it +    F = fun(Mod) -> +        M = filename:basename(Mod, ".erl"), +        MatchesTest = fun(Dir) -> filename:basename(Dir, ".erl") ++ "_tests" == M end,  +        case lists:any(MatchesTest, AppMods) of +            false -> {true, {module, list_to_atom(M)}}; +            true  -> false +        end +    end, +    lists:usort(rebar_utils:filtermap(F, TestMods)). +  inject_eunit_state(State, {ok, Tests}) ->      Apps = rebar_state:project_apps(State),      case inject_eunit_state(State, Apps, []) of | 
