diff --git a/apps/language_server/lib/language_server/providers/workspace_symbols.ex b/apps/language_server/lib/language_server/providers/workspace_symbols.ex index c6268024d..a9c66bae7 100644 --- a/apps/language_server/lib/language_server/providers/workspace_symbols.ex +++ b/apps/language_server/lib/language_server/providers/workspace_symbols.ex @@ -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 diff --git a/apps/language_server/test/support/fixtures/workspace_symbols.ex b/apps/language_server/test/fixtures/workspace_symbols/lib/workspace_symbols.ex similarity index 100% rename from apps/language_server/test/support/fixtures/workspace_symbols.ex rename to apps/language_server/test/fixtures/workspace_symbols/lib/workspace_symbols.ex diff --git a/apps/language_server/test/fixtures/workspace_symbols/mix.exs b/apps/language_server/test/fixtures/workspace_symbols/mix.exs new file mode 100644 index 000000000..f0a7e3a1d --- /dev/null +++ b/apps/language_server/test/fixtures/workspace_symbols/mix.exs @@ -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 diff --git a/apps/language_server/test/providers/workspace_symbols_test.exs b/apps/language_server/test/providers/workspace_symbols_test.exs index 43ecd1254..337b57cc9 100644 --- a/apps/language_server/test/providers/workspace_symbols_test.exs +++ b/apps/language_server/test/providers/workspace_symbols_test.exs @@ -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( @@ -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( @@ -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}, @@ -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( @@ -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}, @@ -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