You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

126 lines
3.8 KiB

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