1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
assert_timeout = String.to_integer(System.get_env("ELIXIR_ASSERT_TIMEOUT") || "500")
System.put_env("ELIXIR_EDITOR", "echo")
{:ok, _} = Application.ensure_all_started(:iex)
IEx.configure(colors: [enabled: false])
{line_exclude, line_include} =
if line = System.get_env("LINE"), do: {[:test], [line: line]}, else: {[], []}
erlang_doc_exclude =
if match?({:docs_v1, _, _, _, %{}, _, _}, Code.fetch_docs(:array)) do
[]
else
IO.puts("Erlang/OTP compiled without docs, some tests are excluded...")
[:erlang_doc]
end
source_exclude =
if :deterministic in :compile.env_compiler_options() do
[:requires_source]
else
[]
end
ExUnit.start(
assert_receive_timeout: assert_timeout,
trace: !!System.get_env("TRACE"),
include: line_include,
exclude: line_exclude ++ erlang_doc_exclude ++ source_exclude
)
defmodule IEx.Case do
use ExUnit.CaseTemplate
@moduledoc false
# Provides convenience functions for testing IEx-related functionality.
# Use this module inside your test module like this:
#
# defmodule IEx.InteractionTest do
# use IEx.Case
#
# test "input" do
# assert capture_iex("1+2") == "3"
# end
# end
#
# The environment provided by capture_iex is mostly similar to the normal IEx
# session, except colors are disabled by default and .iex files are not
# loaded.
#
# You can provide your own IEx configuration and a path to a .iex file as
# additional arguments to the capture_iex function.
using do
quote do
import ExUnit.CaptureIO
import ExUnit.CaptureLog
import unquote(__MODULE__)
end
end
@keys [:default_prompt, :alive_prompt, :inspect, :colors, :history_size, :dot_iex]
@iex_env Application.get_all_env(:iex) |> Keyword.take(@keys)
setup do
on_exit(fn ->
env = @iex_env
Enum.each(@keys, &Application.delete_env(:iex, &1))
IEx.configure(env)
end)
:ok
end
@doc """
Starts an IEx eval loop, feeds it the provided input and returns produced
output. The output is stripped of the first intro line and of any trailing
whitespace.
Options, if provided, will be set before the eval loop is started.
If you provide server options, it will be passed to
IEx.Server.run to be used in the normal .iex loading process.
"""
def capture_iex(input, options \\ [], server_options \\ [], capture_prompt \\ false) do
IEx.configure(options)
ExUnit.CaptureIO.capture_io([input: input, capture_prompt: capture_prompt], fn ->
server_options = Keyword.put_new(server_options, :dot_iex, "")
IEx.Server.run(server_options)
end)
|> strip_iex()
end
defp strip_iex(string) do
string
|> String.split("\n", parts: 2)
|> Enum.at(1)
|> String.trim()
end
end
|