diff options
| -rw-r--r-- | src/rebar_prv_common_test.erl | 28 | ||||
| -rw-r--r-- | src/rebar_prv_eunit.erl | 31 | 
2 files changed, 50 insertions, 9 deletions
| diff --git a/src/rebar_prv_common_test.erl b/src/rebar_prv_common_test.erl index 46d3240..7a52c92 100644 --- a/src/rebar_prv_common_test.erl +++ b/src/rebar_prv_common_test.erl @@ -51,6 +51,7 @@ do(State) ->                        TestState = test_state(S, InDirs, OutDir),                        ok = rebar_erlc_compiler:compile(TestState, AppDir)                    end, TestApps), +    ok = maybe_compile_extra_tests(TestApps, State, InDirs, OutDir),      Path = code:get_path(),      true = code:add_patha(OutDir),      CTOpts = resolve_ct_opts(State, Opts, OutDir), @@ -283,10 +284,17 @@ test_state(State, InDirs, OutDir) ->      ErlOpts = rebar_state:get(State, common_test_compile_opts, []) ++                rebar_utils:erl_opts(State),      TestOpts = [{outdir, OutDir}] ++ -               [{src_dirs, ["src", "test"] ++ InDirs}] ++ -               ErlOpts, +               add_test_dir(ErlOpts, InDirs),      first_files(rebar_state:set(State, erl_opts, TestOpts)). +add_test_dir(Opts, InDirs) -> +    %% if no src_dirs are set we have to specify `src` or it won't +    %% be built +    case proplists:append_values(src_dirs, Opts) of +        [] -> [{src_dirs, ["src", "test"|InDirs]}]; +        _ -> [{src_dirs, ["test"|InDirs]}] +    end. +  first_files(State) ->      BaseFirst = rebar_state:get(State, erl_first_files, []),      CTFirst = rebar_state:get(State, common_test_first_files, []), @@ -302,6 +310,22 @@ resolve_ct_opts(State, CmdLineOpts, OutDir) ->      %% and disable `auto_compile`      [{auto_compile, false}, {dir, OutDir}] ++ lists:keydelete(dir, 1, Opts). +maybe_compile_extra_tests(TestApps, State, InDirs, OutDir) -> +    F = fun(App) -> rebar_app_info:dir(App) == rebar_dir:get_cwd() end, +    case lists:filter(F, TestApps) of +        %% compile just the `test` and extra test directories of the base dir +        [] -> +            ErlOpts = rebar_state:get(State, common_test_compile_opts, []) ++ +                      rebar_utils:erl_opts(State), +            TestOpts = [{outdir, OutDir}] ++ +                       [{src_dirs, ["test"|InDirs]}] ++ +                       lists:keydelete(src_dirs, 1, ErlOpts), +            TestState = first_files(rebar_state:set(State, erl_opts, TestOpts)), +            rebar_erlc_compiler:compile(TestState, rebar_dir:get_cwd()); +        %% already compiled `./test` so do nothing +        _ -> ok +    end. +  handle_results([Result]) ->      handle_results(Result);  handle_results([Result|Results]) when is_list(Results) -> diff --git a/src/rebar_prv_eunit.erl b/src/rebar_prv_eunit.erl index 499a04f..ee8a235 100644 --- a/src/rebar_prv_eunit.erl +++ b/src/rebar_prv_eunit.erl @@ -51,9 +51,10 @@ do(State) ->                        %% combine `erl_first_files` and `eunit_first_files` and adjust                        %% compile opts to include `eunit_compile_opts`, `{d, 'TEST'}`                        %% and `{src_dirs, "test"}` -                      TestState = first_files(test_opts(S, OutDir)), +                      TestState = first_files(test_state(S, OutDir)),                        ok = rebar_erlc_compiler:compile(TestState, AppDir)                    end, TestApps), +    ok = maybe_compile_extra_tests(TestApps, State, OutDir),      Path = code:get_path(),      true = code:add_patha(OutDir),      EUnitOpts = resolve_eunit_opts(State, Opts), @@ -104,12 +105,12 @@ filter_checkouts([App|Rest], Acc) ->          false -> filter_checkouts(Rest, [App|Acc])      end. -test_opts(State, TmpDir) -> +test_state(State, TmpDir) ->      ErlOpts = rebar_state:get(State, eunit_compile_opts, []) ++                rebar_utils:erl_opts(State), -    TestOpts = [{outdir, TmpDir}] ++ -               add_test_dir(ErlOpts) ++ -               safe_define_test_macro(ErlOpts), +    ErlOpts1 = [{outdir, TmpDir}] ++ +               add_test_dir(ErlOpts), +    TestOpts = safe_define_test_macro(ErlOpts1),      rebar_state:set(State, erl_opts, TestOpts).  add_test_dir(Opts) -> @@ -117,8 +118,8 @@ add_test_dir(Opts) ->      %% be built      case proplists:append_values(src_dirs, Opts) of          [] -> [{src_dirs, ["src", "test"]}]; -        _ -> [{src_dirs, ["test"]}] -    end. +        Srcs -> [{src_dirs, ["test"|Srcs]}] +    end ++ lists:keydelete(src_dirs, 1, Opts).  safe_define_test_macro(Opts) ->      %% defining a compile macro twice results in an exception so @@ -151,6 +152,22 @@ set_verbose(Opts) ->          false -> [verbose] ++ Opts      end. +maybe_compile_extra_tests(TestApps, State, OutDir) -> +    F = fun(App) -> rebar_app_info:dir(App) == rebar_dir:get_cwd() end, +    case lists:filter(F, TestApps) of +        %% compile just the `test` and extra test directories of the base dir +        [] -> +            ErlOpts = rebar_state:get(State, common_test_compile_opts, []) ++ +                      rebar_utils:erl_opts(State), +            TestOpts = [{outdir, OutDir}] ++ +                       [{src_dirs, ["test"]}] ++ +                       safe_define_test_macro(lists:keydelete(src_dirs, 1, ErlOpts)), +            TestState = first_files(rebar_state:set(State, erl_opts, TestOpts)), +            rebar_erlc_compiler:compile(TestState, rebar_dir:get_cwd()); +        %% already compiled `./test` so do nothing +        _ -> ok +    end. +  handle_results(ok) -> ok;  handle_results(error) ->      {error, unknown_error}; | 
