defmodule MixTestInteractive do
@moduledoc """
Interactively run your Elixir project's tests.
"""
alias MixTestInteractive.CommandLineParser
alias MixTestInteractive.InitialSupervisor
alias MixTestInteractive.InteractiveMode
alias MixTestInteractive.MainSupervisor
@application :mix_test_interactive
@doc """
Start the interactive test runner.
"""
def run(args \\ []) when is_list(args) do
case CommandLineParser.parse(args) do
{:ok, :help} ->
IO.puts(CommandLineParser.usage_message())
{:ok, :version} ->
IO.puts("mix test.interactive v#{Application.spec(@application, :vsn)}")
{:ok, %{config: config, settings: settings}} ->
{:ok, _apps} = Application.ensure_all_started(@application)
{:ok, _supervisor} =
DynamicSupervisor.start_child(InitialSupervisor, {MainSupervisor, config: config, settings: settings})
loop()
{:error, error} ->
message = [
:bright,
:red,
Exception.message(error),
:reset,
"\n\nTry `mix test.interactive --help` for more information"
]
formatted = IO.ANSI.format(message)
IO.puts(:standard_error, formatted)
exit({:shutdown, 1})
end
end
defp loop do
command = IO.gets("")
InteractiveMode.process_command(command)
loop()
end
end