-module(gurka_eunit). -include_lib("eunit/include/eunit.hrl"). -export([setup/1, setup/2, setup/3]). -type eunit_fixture() :: {setup, spawn, Setup::fun(), Cleanup::fun(), Tests::fun()}. -spec setup(Setup) -> eunit_fixture() when Setup :: fun(). setup(Setup) -> setup(Setup, fun(_) -> ok end). -spec setup(Setup, Cleanup) -> eunit_fixture() when Setup :: fun(), Cleanup :: fun(). setup(Setup, Cleanup) -> setup(Setup, Cleanup, fun(Message) -> io:fwrite(user, "~s~n", [Message]) end). -spec setup(Setup, Cleanup, Log) -> eunit_fixture() when Setup :: [file:name_all()] | fun(), Cleanup :: fun(), Log :: fun(). setup(Features, Cleanup, Log) when is_list(Features) -> setup(fun() -> Features end, Cleanup, Log); setup(Setup, Cleanup, Log) -> {setup, spawn, Setup, Cleanup, fun(Files) -> features(Log, Files) end}. features(Log, Files) -> Timeout = parse_timeout(), {inorder, [{timeout, Timeout, fun() -> feature(Log, File) end} || File <- Files]}. feature(Log, File) -> erlang:group_leader(erlang:whereis(user), self()), Tags = parse_tags(), Formatter = parse_format(), Options = [{file, File}, {tags, Tags}, {formatter, Formatter}, {log, Log}], {Status, Result} = gurka:run(File, Options), Log(io_lib:format("~s", [Formatter:format(Status, Result, Options)])), case Status of ok -> ok; fail -> erlang:error({failed, File}) end. parse_timeout() -> case os:getenv("TIMEOUT") of false -> 60; Timeout -> list_to_number(Timeout) end. parse_tags() -> case os:getenv("TAGS") of false -> []; Tags -> [list_to_binary(Tag) || Tag <- string:tokens(Tags, ", ")] end. parse_format() -> case os:getenv("FORMAT") of false -> gurka_formatter_compact; Format -> list_to_atom("gurka_formatter_" ++ Format) end. list_to_number(L) -> try list_to_float(L) catch error:badarg -> list_to_integer(L) end.