Code.require_file "test_helper.exs", __DIR__ Code.require_file "../lib/server.exs", __DIR__ defmodule ServerTest do use ExUnit.Case import ExUnit.CaptureIO setup_all do on_exit fn -> {_status, files} = File.ls Path.expand("fixtures", __DIR__) files |> Enum.each(fn(file) -> unless file == ".gitkeep" do File.rm Path.expand("fixtures/#{file}", __DIR__) end end) end end test "Expression completion" do assert send_signal("COMP { 'def', [context: Elixir, imports: [], aliases: []]}") =~ """ defoverridable/1 """ end test "Documentation lookup" do assert send_signal("DOCL { 'List', [context: Elixir, imports: [], aliases: []]}") =~ """ \e[0m\n\e[7m\e[33m List \e[0m\n\e[0m """ end test "Getting the definition source file information of code" do assert send_signal("DEFL {\"List,delete\", [context: Elixir, imports: [], aliases: []]}") =~ "/lib/elixir/lib/list.ex" end test "Evaluate the content of a file" do filename = Path.expand("fixtures/eval_fixture.exs", __DIR__) File.write(filename, "1+1") assert send_signal("EVAL { :eval, '#{filename}' }") =~ "2" end test "Evaluate and quote the content of a file" do filename = Path.expand("fixtures/eval_and_quote_fixture.exs", __DIR__) File.write(filename, "[4,2,1,3] |> Enum.sort") assert send_signal("EVAL { :quote, '#{filename}' }") =~ """ {{:., [line: 1], [{:__aliases__, [counter: 0, line: 1], [:Enum]}, :sort]},\n [line: 1], []}]} """ end test "Expand macro once" do filename = Path.expand("fixtures/macro_expand_once_fixture.exs", __DIR__) File.write(filename, "unless true, do: IO.puts \"this should never be printed\"") assert send_signal("EVAL { :expand_once, '#{filename}' }") =~ """ if(true) do nil else IO.puts("this should never be printed") end """ end test "Expand macro" do filename = Path.expand("fixtures/macro_expand_fixture.exs", __DIR__) File.write(filename, "unless true, do: IO.puts \"this should never be printed\"") assert send_signal("EVAL { :expand, '#{filename}' }") =~ """ case(true) do x when x in [false, nil] -> IO.puts("this should never be printed") _ -> nil end """ end test "Get all available application modules" do assert send_signal("INFO { :type, :modules }") =~ """ Elixir.Logger Elixir.Logger.Formatter Elixir.Logger.Translator """ end test "Get all available mix tasks by name" do assert send_signal("INFO { :type, :mixtasks }") =~ """ app.start archive archive.build archive.install archive.uninstall clean cmd compile """ end # The IEx.Helpers.t and IEx.Helpers.i are functionality which come with # Elixir version 1.2.0 if Version.match?(System.version, ">=1.2.0-rc") do test "Get information from data type" do assert send_signal("INFO { :type, :info, List}") =~ """ Reference modules\e[0m\n\e[22m Module, Atom\e[0m\nEND-OF-INFO """ end test "Don't crash server if data type argument is faulty" do assert send_signal("INFO { :type, :info, whatever}") =~ """ END-OF-INFO """ end test "Prints the types for the given module or for the given function/arity pair" do assert send_signal("INFO { :type, :types, 'Agent'}") =~ """ @type agent() :: pid() | {atom(), node()} | name()\e[0m\n\e[22m@type state() :: term()\e[0m\nEND-OF-INFO """ assert send_signal("INFO { :type, :types, 'Agent.on_start/0'}") =~ """ @type on_start() :: {:ok, pid()} | {:error, {:already_started, pid()} | term()}\e[0m """ end end defp send_signal(signal) do capture_io(fn -> Alchemist.Server.read_input(signal) end) end end