Skip to content

Commit

Permalink
fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszsamson committed Jan 8, 2024
1 parent 5f20d5e commit a53d6aa
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,15 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbols do
GenServer.cast(__MODULE__, :notify_settings_stored)
end

def notify_build_complete(server \\ __MODULE__, override_test_mode \\ false) do
unless :persistent_term.get(:language_server_test_mode, false) && not override_test_mode do
def notify_build_complete(server \\ __MODULE__) do
unless :persistent_term.get(:language_server_test_mode, false) and not :persistent_term.get(:language_server_override_test_mode, false) do
GenServer.cast(server, :build_complete)
end
end

@spec notify_uris_modified([String.t()]) :: :ok | nil
def notify_uris_modified(uris, server \\ __MODULE__, override_test_mode \\ false) do
unless :persistent_term.get(:language_server_test_mode, false) && not override_test_mode do
def notify_uris_modified(uris, server \\ __MODULE__) do
unless :persistent_term.get(:language_server_test_mode, false) and not :persistent_term.get(:language_server_override_test_mode, false) do
GenServer.cast(server, {:uris_modified, uris})
end
end
Expand Down
15 changes: 15 additions & 0 deletions apps/language_server/test/fixtures/workspace_symbols/mix.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
defmodule ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.Mixfile do
use Mix.Project

def project do
[app: :els_workspace_symbols_test, version: "0.1.0"]
end

# Configuration for the OTP application
#
# Type "mix help compile.app" for more information
def application do
# Specify extra applications you'll use from Erlang/Elixir
[]
end
end
129 changes: 83 additions & 46 deletions apps/language_server/test/providers/workspace_symbols_test.exs
Original file line number Diff line number Diff line change
@@ -1,62 +1,89 @@
defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
use ExUnit.Case, async: false
alias ElixirLS.LanguageServer.Providers.WorkspaceSymbols
alias ElixirLS.LanguageServer.{Server, Protocol, Tracer, MixProjectCache}
use ElixirLS.Utils.MixTest.Case, async: false
import ElixirLS.LanguageServer.Test.ServerTestHelpers
use Protocol

setup do
alias ElixirLS.Utils.PacketCapture
packet_capture = start_supervised!({PacketCapture, self()})
{:ok, pid} = start_supervised({WorkspaceSymbols, name: nil})
Process.group_leader(pid, packet_capture)

state = :sys.get_state(pid)

fixture_uri =
ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.module_info(:compile)[:source]
|> List.to_string()
|> ElixirLS.LanguageServer.SourceFile.Path.to_uri()

:sys.replace_state(pid, fn _ ->
%{
state
| modules_indexed: true,
modified_uris: [fixture_uri]
}
{:ok, _} = start_supervised(Tracer)
{:ok, server} = Server.start_link()
{:ok, _} = start_supervised(MixProjectCache)
# {:ok, pid} = start_supervised({WorkspaceSymbols, name: nil})
start_server(server)
:persistent_term.put(:language_server_override_test_mode, true)

on_exit(fn ->
:persistent_term.put(:language_server_override_test_mode, false)
if Process.alive?(server) do
Process.monitor(server)
GenServer.stop(server)

receive do
{:DOWN, _, _, ^server, _} ->
:ok
end
end
end)

WorkspaceSymbols.notify_build_complete(pid, true)

wait_until_indexed(pid)

{:ok, server: pid}
{:ok, %{server: server}}
end

test "empty query", %{server: server} do
assert {:ok, list} = WorkspaceSymbols.symbols("", server)
in_fixture(Path.join(__DIR__, ".."), "workspace_symbols", fn ->
initialize(server)

assert_receive %{
"method" => "window/logMessage",
"params" => %{"message" => "Compile took" <> _}
},
20000

assert {:ok, list} = WorkspaceSymbols.symbols("")
assert is_list(list)
assert list != []
end)
end

test "returns modules", %{server: server} do
assert {:ok, list} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.", server)
in_fixture(Path.join(__DIR__, ".."), "workspace_symbols", fn ->
initialize(server)

assert_receive %{
"method" => "window/logMessage",
"params" => %{"message" => "Compile took" <> _}
},
20000

assert {:ok, list} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.")

assert module =
Enum.find(list, &(&1.name == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"))

assert module.kind == 11
assert module.location.uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
assert module.location.uri |> String.ends_with?("lib/workspace_symbols.ex")

assert module.location.range == %{
end: %{character: 0, line: 1},
start: %{character: 0, line: 0}
}

assert WorkspaceSymbols.symbols("work", server)
assert WorkspaceSymbols.symbols("work")
|> elem(1)
|> Enum.any?(&(&1.name == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"))
end)
end

test "returns functions", %{server: server} do
assert {:ok, list} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.", server)
in_fixture(Path.join(__DIR__, ".."), "workspace_symbols", fn ->
initialize(server)

assert_receive %{
"method" => "window/logMessage",
"params" => %{"message" => "Compile took" <> _}
},
20000
assert {:ok, list} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.")

assert some_function =
Enum.find(
Expand All @@ -69,22 +96,31 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
assert some_function.containerName == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"

assert some_function.location.uri
|> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
|> String.ends_with?("lib/workspace_symbols.ex")

assert some_function.location.range == %{
end: %{character: 0, line: 2},
start: %{character: 0, line: 1}
}

assert WorkspaceSymbols.symbols("fun", server)
assert WorkspaceSymbols.symbols("fun")
|> elem(1)
|> Enum.any?(
&(&1.name == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_function/1")
)
end)
end

test "returns types", %{server: server} do
assert {:ok, list} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.", server)
in_fixture(Path.join(__DIR__, ".."), "workspace_symbols", fn ->
initialize(server)

assert_receive %{
"method" => "window/logMessage",
"params" => %{"message" => "Compile took" <> _}
},
20000
assert {:ok, list} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.")

assert some_type =
Enum.find(
Expand All @@ -97,7 +133,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
assert some_type.containerName == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"

assert some_type.location.uri
|> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
|> String.ends_with?("lib/workspace_symbols.ex")

assert some_type.location.range == %{
end: %{character: 0, line: 8},
Expand All @@ -109,15 +145,24 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
&(&1.name == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_opaque_type/0")
)

assert WorkspaceSymbols.symbols("opa", server)
assert WorkspaceSymbols.symbols("opa")
|> elem(1)
|> Enum.any?(
&(&1.name == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_opaque_type/0")
)
end)
end

test "returns callbacks", %{server: server} do
assert {:ok, list} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.", server)
in_fixture(Path.join(__DIR__, ".."), "workspace_symbols", fn ->
initialize(server)

assert_receive %{
"method" => "window/logMessage",
"params" => %{"message" => "Compile took" <> _}
},
20000
assert {:ok, list} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.")

assert some_callback =
Enum.find(
Expand All @@ -130,7 +175,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
assert some_callback.containerName == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"

assert some_callback.location.uri
|> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
|> String.ends_with?("lib/workspace_symbols.ex")

assert some_callback.location.range == %{
end: %{character: 0, line: 5},
Expand All @@ -142,19 +187,11 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
&(&1.name == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_macrocallback/1")
)

assert WorkspaceSymbols.symbols("macr", server)
assert WorkspaceSymbols.symbols("macr")
|> elem(1)
|> Enum.any?(
&(&1.name == "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_macrocallback/1")
)
end

defp wait_until_indexed(pid) do
state = :sys.get_state(pid)

if state.modules == [] do
Process.sleep(500)
wait_until_indexed(pid)
end
end)
end
end

0 comments on commit a53d6aa

Please sign in to comment.