defmodule Mix.Tasks.Eunit do use Mix.Task @shortdoc "Run the project's EUnit test suite" @moduledoc """ # Command line options * `--verbose`, `-v` - verbose mode * other options supported by `compile*` tasks """ def run(args) do {opts, args, rem_opts} = OptionParser.parse(args, strict: [verbose: :boolean], aliases: [v: :verbose]) new_args = args ++ MixErlangTasks.Util.filter_opts(rem_opts) # use a different env from :test because compilation options differ Mix.env :etest compile_opts = [{:d,:TEST}|Mix.Project.config[:erlc_options]] System.put_env "ERL_COMPILER_OPTIONS", format_compile_opts(compile_opts) Mix.Task.run "compile", new_args # This is run independently, so that the test modules don't end up in the # .app file ebin_test = Path.join([Mix.Project.app_path, "test_beams"]) MixErlangTasks.Util.compile_files(Path.wildcard("etest/**/*_tests.erl"), ebin_test) options = if Keyword.get(opts, :verbose, false), do: [:verbose], else: [] :eunit.test {:application, Mix.Project.config[:app]}, options end defp format_compile_opts(opts) do :io_lib.format("~p", [opts]) |> List.to_string end end