diff --git a/.hgignore b/.hgignore index ad6143a..684e0cb 100644 --- a/.hgignore +++ b/.hgignore @@ -2,3 +2,4 @@ ^rebar$ .~ \.orig +\.swp diff --git a/priv/templates/simplefsm.erl b/priv/templates/simplefsm.erl new file mode 100644 index 0000000..039532c --- /dev/null +++ b/priv/templates/simplefsm.erl @@ -0,0 +1,55 @@ +-module({{fsmid}}). +-behaviour(gen_fsm). +-define(SERVER, ?MODULE). + +%% ------------------------------------------------------------------ +%% API Function Exports +%% ------------------------------------------------------------------ + +-export([start_link/0]). + +%% ------------------------------------------------------------------ +%% gen_fsm Function Exports +%% ------------------------------------------------------------------ + +-export([init/1, state_name/2, state_name/3, handle_event/3, handle_sync_event/4, handle_info/3, terminate/3, code_change/4]). + +%% ------------------------------------------------------------------ +%% API Function Definitions +%% ------------------------------------------------------------------ + +start_link() -> + gen_fsm:start_link({local, ?SERVER}, ?MODULE, [], []). + +%% ------------------------------------------------------------------ +%% gen_fsm Function Definitions +%% ------------------------------------------------------------------ + +init(_Args) -> + {ok, initial_state_name, initial_state}. + +state_name(_Event, State) -> + {next_state, state_name, State}. + +state_name(_Event, _From, State) -> + {reply, ok, state_name, State}. + +handle_event(_Event, StateName, State) -> + {next_state, StateName, State}. + +handle_sync_event(_Event, _From, StateName, State) -> + {reply, ok, StateName, State}. + +handle_info(_Info, StateName, State) -> + {next_state, StateName, State}. + +terminate(_Reason, _StateName, _State) -> + ok. + +code_change(_OldVsn, StateName, State, _Extra) -> + {ok, StateName, State}. + +%% ------------------------------------------------------------------ +%% Internal Function Definitions +%% ------------------------------------------------------------------ + diff --git a/priv/templates/simplefsm.template b/priv/templates/simplefsm.template new file mode 100644 index 0000000..edb6f56 --- /dev/null +++ b/priv/templates/simplefsm.template @@ -0,0 +1,2 @@ +{variables, [{fsmid, "myfsm"}]}. +{file, "simplefsm.erl", "src/{{fsmid}}.erl"}. diff --git a/priv/templates/simplemod.erl b/priv/templates/simplemod.erl new file mode 100644 index 0000000..2baff59 --- /dev/null +++ b/priv/templates/simplemod.erl @@ -0,0 +1,10 @@ +-module({{modid}}). + +-export([my_func/0]). + +-ifdef(TEST). +-compile(export_all). +-endif. + +my_func() -> + ok. diff --git a/priv/templates/simplemod.template b/priv/templates/simplemod.template new file mode 100644 index 0000000..1de8cd0 --- /dev/null +++ b/priv/templates/simplemod.template @@ -0,0 +1,3 @@ +{variables, [{modid, "mymod"}]}. +{file, "simplemod.erl", "src/{{modid}}.erl"}. +{file, "simplemod_tests.erl", "test/{{modid}}_tests.erl"}. diff --git a/priv/templates/simplemod_tests.erl b/priv/templates/simplemod_tests.erl new file mode 100644 index 0000000..c5ca0bb --- /dev/null +++ b/priv/templates/simplemod_tests.erl @@ -0,0 +1,3 @@ +-module({{modid}}_tests). +-include_lib("eunit/include/eunit.hrl"). + diff --git a/priv/templates/simplesrv.erl b/priv/templates/simplesrv.erl new file mode 100644 index 0000000..8db932e --- /dev/null +++ b/priv/templates/simplesrv.erl @@ -0,0 +1,49 @@ +-module({{srvid}}). +-behaviour(gen_server). +-define(SERVER, ?MODULE). + +%% ------------------------------------------------------------------ +%% API Function Exports +%% ------------------------------------------------------------------ + +-export([start_link/0]). + +%% ------------------------------------------------------------------ +%% gen_server Function Exports +%% ------------------------------------------------------------------ + +-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). + +%% ------------------------------------------------------------------ +%% API Function Definitions +%% ------------------------------------------------------------------ + +start_link() -> + gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). + +%% ------------------------------------------------------------------ +%% gen_server Function Definitions +%% ------------------------------------------------------------------ + +init(Args) -> + {ok, Args}. + +handle_call(_Request, _From, State) -> + {noreply, ok, State}. + +handle_cast(_Msg, State) -> + {noreply, State}. + +handle_info(_Info, State) -> + {noreply, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%% ------------------------------------------------------------------ +%% Internal Function Definitions +%% ------------------------------------------------------------------ + diff --git a/priv/templates/simplesrv.template b/priv/templates/simplesrv.template new file mode 100644 index 0000000..e72dd25 --- /dev/null +++ b/priv/templates/simplesrv.template @@ -0,0 +1,2 @@ +{variables, [{srvid, "myserver"}]}. +{file, "simplesrv.erl", "src/{{srvid}}.erl"}. diff --git a/src/rebar_eunit.erl b/src/rebar_eunit.erl index d51c35d..4c280e9 100644 --- a/src/rebar_eunit.erl +++ b/src/rebar_eunit.erl @@ -58,9 +58,13 @@ eunit(Config, _File) -> %% Make sure ?EUNIT_DIR/ directory exists (tack on dummy module) ok = filelib:ensure_dir(?EUNIT_DIR ++ "/foo"), + %% grab all the test modules for inclusion in the compile stage + TestErls = rebar_utils:find_files("test", ".*\\.erl\$"), + %% Compile erlang code to ?EUNIT_DIR, using a tweaked config - %% with appropriate defines for eunit - rebar_erlc_compiler:doterl_compile(eunit_config(Config), ?EUNIT_DIR), + %% with appropriate defines for eunit, and include all the test modules + %% as well. + rebar_erlc_compiler:doterl_compile(eunit_config(Config), ?EUNIT_DIR, TestErls), %% Build a list of all the .beams in ?EUNIT_DIR -- use this for cover %% and eunit testing. Normally you can just tell cover and/or eunit to @@ -68,7 +72,36 @@ eunit(Config, _File) -> %% with that scan and causes any cover compilation info to be lost. So, %% we do it by hand. :( %% - Modules = [rebar_utils:beam_to_mod(?EUNIT_DIR, N) || N <- rebar_utils:beams(?EUNIT_DIR)], + %% TODO: Not currently compatible with package modules + Beams = [filename:basename(N, ".beam") || N <- rebar_utils:beams(?EUNIT_DIR)], + + %% Grab two lists of test and non-test beam files + {TestBeams, ModuleBeams} = lists:partition(fun(B) -> + lists:suffix("_tests", B) end, Beams), + + case rebar_config:get_global(suite, undefined) of + undefined -> + %% no suite defined, so include all modules + RealModules = ModuleBeams, + + %% exclude any test modules that have a matching module + TestModules = [T || T <- TestBeams, + lists:member(string:left(T, length(T) - 6), RealModules) == false]; + SuiteName -> + %% suite defined, so only specify the module that relates to the + %% suite (if any) + RealModules = [M || M <- ModuleBeams, SuiteName =:= M], + + %% only include the test suite if the main module doesn't exist + TestModules = case length(RealModules) of + 0 -> [T || T <- TestBeams, T =:= SuiteName ++ "_tests"]; + _ -> [] + end + end, + + %% combine the modules and associated test modules into the resulting list + %% of modules to run tests on. + Modules = [list_to_atom(M) || M <- RealModules ++ TestModules], %% TODO: If there are other wildcards specified in eunit_sources, compile them