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