lib/mix/tasks/purerl/test.ex

defmodule Mix.Tasks.Purerl.Test do
  @moduledoc "Runs `purerl` tests"

  use Mix.Task

  require PurerlAlias

  PurerlAlias.alias(PurerlTest.ModuleUtilities, as: Utilities)

  @impl Mix.Task
  def run(_args) do
    initialize_environment()

    Utilities.findPureScriptSpecModules().()
    |> Enum.map(&Utilities.pureScriptModuleToErlangModule/1)
    |> Enum.each(fn module -> module.main().() end)

    receive_until_done()
  end

  defp initialize_environment() do
    Application.ensure_all_started(:purerl_test)
    :gproc.reg({:p, :l, :"PurerlTest.Reporter.Bus"})
  end

  defp receive_until_done() do
    receive do
      {:msg, {:allDone, 0 = _exit_code}} ->
        IO.puts("🎉 All done!")

      {:msg, {:allDone, exit_code}} ->
        IO.puts("❌ Done with failures.")
        exit({:shutdown, exit_code})

      _other ->
        receive_until_done()
    end
  end
end