Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#1110] Discover test files automatically #1111

Merged
merged 1 commit into from
Oct 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions apps/els_lsp/test/els_diagnostics_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -448,8 +448,8 @@ compiler_telemetry(Config) ->
ok.

-spec code_path_extra_dirs(config()) -> ok.
code_path_extra_dirs(Config) ->
RootPath = binary_to_list(?config(root_path, Config)),
code_path_extra_dirs(_Config) ->
RootPath = binary_to_list(els_test_utils:root_path()),
Dirs = [ AbsDir
|| Dir <- filelib:wildcard("*", RootPath),
filelib:is_dir(AbsDir = filename:absname(Dir, RootPath))],
Expand All @@ -467,8 +467,8 @@ use_long_names(_Config) ->
ok.

-spec epp_with_nonexistent_macro(config()) -> ok.
epp_with_nonexistent_macro(Config) ->
RootPath = ?config(root_path, Config),
epp_with_nonexistent_macro(_Config) ->
RootPath = els_test_utils:root_path(),
Path = filename:join([RootPath, <<"include">>, <<"nonexistent_macro.hrl">>]),
Uri = els_uri:uri(Path),
els_mock_diagnostics:subscribe(),
Expand All @@ -492,7 +492,7 @@ epp_with_nonexistent_macro(Config) ->
-spec elvis(config()) -> ok.
elvis(Config) ->
{ok, Cwd} = file:get_cwd(),
RootPath = ?config(root_path, Config),
RootPath = els_test_utils:root_path(),
try
file:set_cwd(RootPath),
Uri = ?config(elvis_diagnostics_uri, Config),
Expand Down
2 changes: 1 addition & 1 deletion apps/els_lsp/test/els_formatter_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ end_per_testcase(TestCase, Config) ->
-spec format_doc(config()) -> ok.
format_doc(Config) ->
{ok, Cwd} = file:get_cwd(),
RootPath = ?config(root_path, Config),
RootPath = els_test_utils:root_path(),
try
file:set_cwd(RootPath),
Uri = ?config(format_input_uri, Config),
Expand Down
24 changes: 12 additions & 12 deletions apps/els_lsp/test/els_initialization_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ end_per_testcase(TestCase, Config) ->
%%==============================================================================

-spec initialize_default(config()) -> ok.
initialize_default(Config) ->
RootUri = ?config(root_uri, Config),
initialize_default(_Config) ->
RootUri = els_test_utils:root_uri(),
els_client:initialize(RootUri),
Result = els_config:get(macros),
Expected = [#{"name" => "DEFINED_WITHOUT_VALUE"},
Expand All @@ -79,8 +79,8 @@ initialize_default(Config) ->
ok.

-spec initialize_custom_relative(config()) -> ok.
initialize_custom_relative(Config) ->
RootUri = ?config(root_uri, Config),
initialize_custom_relative(_Config) ->
RootUri = els_test_utils:root_uri(),
ConfigPath = <<"../rebar3_release/erlang_ls.config">>,
InitOpts = #{ <<"erlang">>
=> #{ <<"config_path">> => ConfigPath }},
Expand All @@ -91,8 +91,8 @@ initialize_custom_relative(Config) ->
ok.

-spec initialize_custom_absolute(config()) -> ok.
initialize_custom_absolute(Config) ->
RootUri = ?config(root_uri, Config),
initialize_custom_absolute(_Config) ->
RootUri = els_test_utils:root_uri(),
ConfigPath = filename:join( els_uri:path(RootUri)
, "../rebar3_release/erlang_ls.config"),
InitOpts = #{ <<"erlang">>
Expand All @@ -105,7 +105,7 @@ initialize_custom_absolute(Config) ->

-spec initialize_diagnostics_default(config()) -> ok.
initialize_diagnostics_default(Config) ->
RootUri = ?config(root_uri, Config),
RootUri = els_test_utils:root_uri(),
DataDir = ?config(data_dir, Config),
ConfigPath = filename:join(DataDir, "diagnostics_default.config"),
InitOpts = #{ <<"erlang">> => #{ <<"config_path">> => ConfigPath }},
Expand All @@ -117,7 +117,7 @@ initialize_diagnostics_default(Config) ->

-spec initialize_diagnostics_custom(config()) -> ok.
initialize_diagnostics_custom(Config) ->
RootUri = ?config(root_uri, Config),
RootUri = els_test_utils:root_uri(),
DataDir = ?config(data_dir, Config),
ConfigPath = filename:join(DataDir, "diagnostics_custom.config"),
InitOpts = #{ <<"erlang">> => #{ <<"config_path">> => ConfigPath }},
Expand All @@ -136,7 +136,7 @@ initialize_diagnostics_custom(Config) ->

-spec initialize_diagnostics_invalid(config()) -> ok.
initialize_diagnostics_invalid(Config) ->
RootUri = ?config(root_uri, Config),
RootUri = els_test_utils:root_uri(),
DataDir = ?config(data_dir, Config),
ConfigPath = filename:join(DataDir, "diagnostics_invalid.config"),
InitOpts = #{ <<"erlang">> => #{ <<"config_path">> => ConfigPath }},
Expand All @@ -156,7 +156,7 @@ initialize_diagnostics_invalid(Config) ->

-spec initialize_lenses_default(config()) -> ok.
initialize_lenses_default(Config) ->
RootUri = ?config(root_uri, Config),
RootUri = els_test_utils:root_uri(),
DataDir = ?config(data_dir, Config),
ConfigPath = filename:join(DataDir, "lenses_default.config"),
InitOpts = #{ <<"erlang">> => #{ <<"config_path">> => ConfigPath }},
Expand All @@ -168,7 +168,7 @@ initialize_lenses_default(Config) ->

-spec initialize_lenses_custom(config()) -> ok.
initialize_lenses_custom(Config) ->
RootUri = ?config(root_uri, Config),
RootUri = els_test_utils:root_uri(),
DataDir = ?config(data_dir, Config),
ConfigPath = filename:join(DataDir, "lenses_custom.config"),
InitOpts = #{ <<"erlang">> => #{ <<"config_path">> => ConfigPath }},
Expand All @@ -183,7 +183,7 @@ initialize_lenses_custom(Config) ->

-spec initialize_lenses_invalid(config()) -> ok.
initialize_lenses_invalid(Config) ->
RootUri = ?config(root_uri, Config),
RootUri = els_test_utils:root_uri(),
DataDir = ?config(data_dir, Config),
ConfigPath = filename:join(DataDir, "lenses_invalid.config"),
InitOpts = #{ <<"erlang">> => #{ <<"config_path">> => ConfigPath }},
Expand Down
10 changes: 5 additions & 5 deletions apps/els_lsp/test/els_io_string_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ end_per_testcase(_TestCase, _Config) -> ok.
%%==============================================================================

-spec scan_forms(config()) -> ok.
scan_forms(Config) ->
Path = path(Config),
scan_forms(_Config) ->
Path = path(),
{ok, IoFile} = file:open(Path, [read]),
Expected = scan_all_forms(IoFile, []),
ok = file:close(IoFile),
Expand All @@ -76,7 +76,7 @@ scan_all_forms(IoDevice, Acc) ->
Acc
end.

-spec path(config()) -> string().
path(Config) ->
RootPath = ?config(root_path, Config) ,
-spec path() -> string().
path() ->
RootPath = els_test_utils:root_path(),
filename:join([RootPath, "src", "code_navigation.erl"]).
177 changes: 48 additions & 129 deletions apps/els_lsp/test/els_test_utils.erl
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,21 @@
, wait_for/2
, wait_for_fun/3
, wait_until_mock_called/2
, root_path/0
, root_uri/0
]).

-include_lib("common_test/include/ct.hrl").

%%==============================================================================
%% Defines
%%==============================================================================
-define(TEST_APP, <<"code_navigation">>).
-define(TEST_APP, "code_navigation").

%%==============================================================================
%% Types
%%==============================================================================
-type config() :: [{atom(), any()}].
-type file_type() :: src | test | include | escript.

%%==============================================================================
%% API
Expand All @@ -40,14 +41,8 @@ all(Module, Functions) ->

-spec init_per_suite(config()) -> config().
init_per_suite(Config) ->
PrivDir = code:priv_dir(els_lsp),
RootPath = filename:join([ els_utils:to_binary(PrivDir)
, ?TEST_APP]),
RootUri = els_uri:uri(RootPath),
application:load(els_core),
[ {root_uri, RootUri}
, {root_path, RootPath}
| Config ].
Config.

-spec end_per_suite(config()) -> ok.
end_per_suite(_Config) ->
Expand All @@ -58,18 +53,12 @@ init_per_testcase(_TestCase, Config) ->
meck:new(els_distribution_server, [no_link, passthrough]),
meck:expect(els_distribution_server, connect, 0, ok),
Started = start(),
RootPath = ?config(root_path, Config),
RootUri = ?config(root_uri, Config),
els_client:initialize(RootUri, #{indexingEnabled => false}),
els_client:initialize(root_uri(), #{indexingEnabled => false}),
els_client:initialized(),
SrcConfig = lists:flatten(
[index_file(RootPath, src, S) || S <- sources()]),
TestConfig = lists:flatten(
[index_file(RootPath, test, S) || S <- tests()]),
EscriptConfig = lists:flatten(
[index_file(RootPath, escript, S) || S <- escripts()]),
IncludeConfig = lists:flatten(
[index_file(RootPath, include, S) || S <- includes()]),
SrcConfig = lists:flatten([index_file(S) || S <- sources()]),
TestConfig = lists:flatten([index_file(S) || S <- tests()]),
EscriptConfig = lists:flatten([index_file(S) || S <- escripts()]),
IncludeConfig = lists:flatten([index_file(S) || S <- includes()]),
lists:append( [ SrcConfig
, TestConfig
, EscriptConfig
Expand Down Expand Up @@ -118,133 +107,48 @@ wait_for_fun(CheckFun, WaitTime, Retries) ->
wait_for_fun(CheckFun, WaitTime, Retries - 1)
end.

-spec sources() -> [atom()].
-spec sources() -> [binary()].
sources() ->
[ 'diagnostics.new'
, behaviour_a
, code_lens_function_references
, code_navigation
, code_navigation_extra
, code_navigation_types
, code_navigation_undefined
, 'Code.Navigation.Elixirish'
, completion
, completion_caller
, completion_resolve
, completion_resolve_2
, completion_snippets
, completion_attributes
, completion_incomplete
, diagnostics
, diagnostics_bound_var_in_pattern
, diagnostics_autoimport
, diagnostics_autoimport_disabled
, diagnostics_behaviour
, diagnostics_behaviour_impl
, diagnostics_macros
, diagnostics_parse_transform
, diagnostics_parse_transform_broken
, diagnostics_parse_transform_deps_a
, diagnostics_parse_transform_deps_b
, diagnostics_parse_transform_deps_c
, diagnostics_parse_transform_usage
, diagnostics_parse_transform_usage_list
, diagnostics_parse_transform_usage_broken
, diagnostics_parse_transform_usage_included
, diagnostics_xref
, diagnostics_xref_pseudo
, diagnostics_unused_includes
, diagnostics_unused_includes_compiler_attribute
, diagnostics_unused_macros
, diagnostics_unused_record_fields
, elvis_diagnostics
, execute_command_suggest_spec
, format_input
, hover_docs
, hover_docs_caller
, hover_macro
, hover_record_expr
, implementation
, implementation_a
, implementation_b
, my_gen_server
, rename
, rename_function
, rename_function_import
, rename_type
, rename_usage1
, rename_usage2
, rename_variable
, call_hierarchy_a
, call_hierarchy_b
, call_hierarchy_c
].
wildcard("*.erl", "src").

-spec tests() -> [binary()].
tests() ->
[ sample_SUITE
].
wildcard("*.erl", "test").

-spec escripts() -> [atom()].
-spec escripts() -> [binary()].
escripts() ->
[ diagnostics
, diagnostics_warnings
, diagnostics_errors
].
wildcard("*.escript", "src").

-spec includes() -> [atom()].
-spec includes() -> [binary()].
includes() ->
[ code_navigation
, transitive
, definition
, diagnostics
, rename
].
wildcard("*.hrl", "include").

%% @doc Index a file and produce the respective config entries
%%
%% Given an identifier representing a source or include file,
%% index it and produce a config containing the respective path,
%% uri and text to simplify accessing this information from test
%% cases.
-spec index_file(binary(), file_type(), atom()) -> [{atom(), any()}].
index_file(RootPath, Type, Id) ->
BinaryId = atom_to_binary(Id, utf8),
Ext = extension(Type),
Dir = directory(Type),
Path = filename:join([RootPath, Dir, <<BinaryId/binary, Ext/binary>>]),
%% Given the path to a source file, index it and produce a config
%% containing the respective path, uri and text to simplify
%% accessing this information from test cases.
-spec index_file(binary()) -> [{atom(), any()}].
index_file(Path) ->
{ok, Uri} = els_indexing:index_file(Path),
{ok, Text} = file:read_file(Path),
ConfigId = config_id(Id, Type),
ConfigId = config_id(Path),
[ {atoms_append(ConfigId, '_path'), Path}
, {atoms_append(ConfigId, '_uri'), Uri}
, {atoms_append(ConfigId, '_text'), Text}
].

-spec config_id(atom(), file_type()) -> atom().
config_id(Id, src) -> Id;
config_id(Id, test) -> Id;
config_id(Id, include) -> list_to_atom(atom_to_list(Id) ++ "_h");
config_id(Id, escript) -> list_to_atom(atom_to_list(Id) ++ "_escript").
-spec suffix(binary()) -> binary().
suffix(<<".erl">>) -> <<"">>;
suffix(<<".hrl">>) -> <<"_h">>;
suffix(<<".escript">>) -> <<"_escript">>.

-spec directory(file_type()) -> binary().
directory(src) ->
<<"src">>;
directory(test) ->
<<"test">>;
directory(include) ->
<<"include">>;
directory(escript) ->
<<"src">>.

-spec extension(file_type()) -> binary().
extension(src) ->
<<".erl">>;
extension(test) ->
<<".erl">>;
extension(include) ->
<<".hrl">>;
extension(escript) ->
<<".escript">>.
-spec config_id(string()) -> atom().
config_id(Path) ->
Extension = filename:extension(Path),
BaseName = filename:basename(Path, Extension),
Suffix = suffix(Extension),
binary_to_atom(<<BaseName/binary, Suffix/binary>>, utf8).

-spec atoms_append(atom(), atom()) -> atom().
atoms_append(Atom1, Atom2) ->
Expand All @@ -261,3 +165,18 @@ wait_until_mock_called(M, F) ->
_ ->
ok
end.

-spec root_path() -> binary().
root_path() ->
PrivDir = code:priv_dir(els_lsp),
els_utils:to_binary(filename:join([PrivDir, ?TEST_APP])).

-spec root_uri() -> els_uri:uri().
root_uri() ->
els_uri:uri(root_path()).

-spec wildcard(string(), string()) -> [binary()].
wildcard(Extension, Dir) ->
RootDir = els_utils:to_list(root_path()),
[els_utils:to_binary(filename:join([RootDir, Dir, Path])) ||
Path <- filelib:wildcard(Extension, filename:join([RootDir, Dir]))].