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