Skip to content

Commit e2823f7

Browse files
authored
Merge pull request #823 from julia-vscode/tests
Improve test coverage
2 parents d5fb184 + 219e237 commit e2823f7

File tree

8 files changed

+378
-2
lines changed

8 files changed

+378
-2
lines changed

src/requests/actions.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,13 @@ function explicitly_import_used_variables(x::EXPR, server, conn)
4848

4949
tdes = Dict{String,TextDocumentEdit}()
5050
vars = Set{String}() # names that need to be imported
51-
5251
# Find uses of `x` and mark edits
5352
for ref in refof(x).refs
5453
if parentof(ref) isa EXPR && typof(parentof(ref)) == CSTParser.BinaryOpCall && length(parentof(ref).args) == 3 && kindof(parentof(ref).args[2]) === CSTParser.Tokens.DOT && parentof(ref).args[1] == ref
5554
typof(parentof(ref).args[3]) !== CSTParser.Quotenode && continue # some malformed EXPR, skip
5655
childname = parentof(ref).args[3].args[1]
5756
StaticLint.hasref(childname) && refof(childname) isa StaticLint.Binding && continue # check this isn't the name of something being explictly overwritten
58-
!haskey(refof(x).val.vals, valof(childname)) && continue # skip, perhaps mark as missing ref ?
57+
!haskey(refof(x).val.vals, Symbol(valof(childname))) && continue # skip, perhaps mark as missing ref ?
5958

6059
file, offset = get_file_loc(ref)
6160
if !haskey(tdes, file._uri)

test/requests/actions.jl

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
action_request_test(line0, char0, line1 = line0, char1 = char0; diags = []) = LanguageServer.textDocument_codeAction_request(LanguageServer.CodeActionParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Range(LanguageServer.Position(line0, char0), LanguageServer.Position(line1, char1)), LanguageServer.CodeActionContext(diags, missing)), server, server.jr_endpoint)
2+
3+
@testset "reexport" begin
4+
settestdoc("using Base.Meta\n")
5+
@test any(c.command == "ReexportModule" for c in action_request_test(0, 15))
6+
c = filter(c->c.command == "ReexportModule", action_request_test(0, 15))[1]
7+
8+
LanguageServer.workspace_executeCommand_request(LanguageServer.ExecuteCommandParams(missing, c.command, c.arguments), server, server.jr_endpoint)
9+
end
10+
11+
@testset "inline expand" begin
12+
settestdoc("f(x) = x")
13+
@test any(c.command == "ExpandFunction" for c in action_request_test(0, 5))
14+
c = filter(c->c.command == "ExpandFunction", action_request_test(0, 5))[1]
15+
16+
LanguageServer.workspace_executeCommand_request(LanguageServer.ExecuteCommandParams(missing, c.command, c.arguments), server, server.jr_endpoint)
17+
18+
settestdoc("f(x) = begin x end")
19+
@test any(c.command == "ExpandFunction" for c in action_request_test(0, 5))
20+
c = filter(c->c.command == "ExpandFunction", action_request_test(0, 5))[1]
21+
22+
LanguageServer.workspace_executeCommand_request(LanguageServer.ExecuteCommandParams(missing, c.command, c.arguments), server, server.jr_endpoint)
23+
end
24+
25+
@testset "fixmissingref" begin
26+
doc = settestdoc("argtail\n")
27+
e = LanguageServer.mark_errors(doc)[1]
28+
@test any(c.command == "FixMissingRef" for c in action_request_test(0, 5, diags = [e]))
29+
c = filter(c->c.command == "FixMissingRef", action_request_test(0, 5, diags = [e]))[1]
30+
31+
LanguageServer.workspace_executeCommand_request(LanguageServer.ExecuteCommandParams(missing, c.command, c.arguments), server, server.jr_endpoint)
32+
end
33+
34+
@testset "explicit import" begin
35+
doc = settestdoc("using Base.Meta\nMeta.quot")
36+
@test LanguageServer.find_using_statement(doc.cst[2][1]) !== nothing
37+
38+
@test any(c.command == "ExplicitPackageVarImport" for c in action_request_test(1, 1))
39+
c = filter(c->c.command == "ExplicitPackageVarImport", action_request_test(1, 1))[1]
40+
41+
LanguageServer.workspace_executeCommand_request(LanguageServer.ExecuteCommandParams(missing, c.command, c.arguments), server, server.jr_endpoint)
42+
end
43+
44+
45+

test/requests/completions.jl

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
completion_test(line, char) = LanguageServer.textDocument_completion_request(LanguageServer.CompletionParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Position(line, char), missing), server, server.jr_endpoint)
2+
3+
@testset "latex completions" begin
4+
settestdoc("""
5+
\\therefor
6+
.\\therefor
7+
#\\therefor
8+
"\\therefor"
9+
\"\"\"\\therefor\"\"\"
10+
^\\therefor
11+
""")
12+
@test completion_test(0, 9).items[1].textEdit.newText == ""
13+
@test completion_test(0, 9).items[1].textEdit.range == LanguageServer.Range(0, 0, 0, 9)
14+
15+
@test completion_test(1, 10).items[1].textEdit.newText == ""
16+
@test completion_test(1, 10).items[1].textEdit.range == LanguageServer.Range(1, 1, 1, 10)
17+
18+
@test completion_test(2, 10).items[1].textEdit.newText == ""
19+
@test completion_test(2, 10).items[1].textEdit.range == LanguageServer.Range(2, 1, 2, 10)
20+
21+
@test completion_test(3, 10).items[1].textEdit.newText == ""
22+
@test completion_test(3, 10).items[1].textEdit.range == LanguageServer.Range(3, 1, 3, 10)
23+
24+
@test completion_test(4, 12).items[1].textEdit.newText == ""
25+
@test completion_test(4, 12).items[1].textEdit.range == LanguageServer.Range(4, 3, 4, 12)
26+
27+
@test completion_test(5, 10).items[1].textEdit.newText == ""
28+
@test completion_test(5, 10).items[1].textEdit.range == LanguageServer.Range(5, 1, 5, 10)
29+
end
30+
31+
@testset "path completions" begin
32+
end
33+
34+
@testset "import completions" begin
35+
settestdoc("import Base: r")
36+
@test any(item.label == "rand" for item in completion_test(0, 14).items)
37+
38+
settestdoc("import ")
39+
@test all(item.label in ("Main", "Base", "Core") for item in completion_test(0, 7).items)
40+
41+
settestdoc("""module M end
42+
import .""")
43+
@test_broken completion_test(1, 8).items[1].label == "M"
44+
45+
settestdoc("import Base.")
46+
@test any(item.label == "Meta" for item in completion_test(0, 12).items)
47+
48+
settestdoc("import Base.M")
49+
@test any(item.label == "Meta" for item in completion_test(0, 13).items)
50+
51+
settestdoc("import Bas")
52+
@test any(item.label == "Base" for item in completion_test(0, 10).items)
53+
end
54+
55+
@testset "getfield completions" begin
56+
settestdoc("Base.")
57+
@test any(item.label == "Base" for item in completion_test(0, 5).items)
58+
59+
settestdoc("Base.r")
60+
@test any(item.label == "rand" for item in completion_test(0, 6).items)
61+
62+
settestdoc("""
63+
using Base.Meta
64+
Base.Meta.
65+
""")
66+
@test any(item.label == "quot" for item in completion_test(1, 10).items)
67+
68+
settestdoc("""
69+
module M
70+
inner = 1
71+
end
72+
M.
73+
""")
74+
@test any(item.label == "inner" for item in completion_test(3, 2).items)
75+
76+
settestdoc("""
77+
x = Expr()
78+
x.
79+
""")
80+
@test all(item.label in ("head", "args") for item in completion_test(1, 2).items)
81+
82+
settestdoc("""
83+
struct T
84+
f1
85+
f2
86+
end
87+
x = T()
88+
x.
89+
""")
90+
@test all(item.label in ("f1", "f2") for item in completion_test(1, 2).items)
91+
end
92+
93+
94+
95+
@testset "token completions" begin
96+
settestdoc("B")
97+
@test any(item.label == "Base" for item in completion_test(0, 1).items)
98+
99+
settestdoc("r")
100+
@test any(item.label == "rand" for item in completion_test(0, 1).items)
101+
102+
settestdoc("@t")
103+
@test any(item.label == "@time" for item in completion_test(0, 2).items)
104+
105+
settestdoc("i")
106+
@test any(item.label == "if" for item in completion_test(0, 1).items)
107+
108+
settestdoc("i")
109+
@test any(item.label == "in" for item in completion_test(0, 1).items)
110+
111+
settestdoc("for")
112+
@test any(item.label == "for" for item in completion_test(0, 3).items)
113+
114+
settestdoc("in")
115+
@test any(item.label == "in" for item in completion_test(0, 2).items)
116+
117+
settestdoc("isa")
118+
@test any(item.label == "isa" for item in completion_test(0, 3).items)
119+
end
120+
121+
@testset "scope var completions" begin
122+
settestdoc("""myvar = 1
123+
myv""")
124+
@test any(item.label == "myvar" for item in completion_test(1, 3).items)
125+
end

test/requests/features.jl

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
sig_test(line, char) = LanguageServer.textDocument_signatureHelp_request(LanguageServer.TextDocumentPositionParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Position(line, char)), server, server.jr_endpoint)
2+
3+
def_test(line, char) = LanguageServer.textDocument_definition_request(LanguageServer.TextDocumentPositionParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Position(line, char)), server, server.jr_endpoint)
4+
5+
ref_test(line, char) = LanguageServer.textDocument_references_request(LanguageServer.ReferenceParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Position(line, char), missing, missing, LanguageServer.ReferenceContext(true)), server, server.jr_endpoint)
6+
7+
rename_test(line, char) = LanguageServer.textDocument_rename_request(LanguageServer.RenameParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Position(line, char), missing, "newname"), server, server.jr_endpoint)
8+
9+
10+
@testset "signatures" begin
11+
doc = settestdoc("""
12+
rand()
13+
Base.rand()
14+
func(arg) = 1
15+
func()
16+
struct T
17+
a
18+
b
19+
end
20+
T()
21+
struct S{R}
22+
a
23+
S() = new(1)
24+
end
25+
using Base:argtail
26+
argtail()
27+
S{R}()
28+
""")
29+
@test !isempty(sig_test(0, 5).signatures)
30+
@test !isempty(sig_test(1, 10).signatures)
31+
@test !isempty(sig_test(3, 5).signatures)
32+
@test !isempty(sig_test(8, 2).signatures)
33+
@test_broken !isempty(sig_test(15, 5).signatures)
34+
35+
let sigs = LanguageServer.SignatureInformation[]
36+
LanguageServer.get_signatures(doc.cst[3].meta.binding, doc.cst.meta.scope, sigs, server)
37+
@test length(sigs) == 1
38+
end
39+
let sigs = LanguageServer.SignatureInformation[]
40+
LanguageServer.get_signatures(doc.cst[5].meta.binding, doc.cst.meta.scope, sigs, server)
41+
@test length(sigs) == 1
42+
end
43+
let sigs = LanguageServer.SignatureInformation[]
44+
LanguageServer.get_signatures(doc.cst[1][1].meta.ref, doc.cst.meta.scope, sigs, server)
45+
@test length(sigs) > 0
46+
end
47+
let sigs = LanguageServer.SignatureInformation[]
48+
LanguageServer.get_signatures(doc.cst[7].meta.binding, doc.cst.meta.scope, sigs, server)
49+
@test length(sigs) == 1
50+
end
51+
let sigs = LanguageServer.SignatureInformation[]
52+
LanguageServer.get_signatures(doc.cst[9][1].meta.ref, doc.cst.meta.scope, sigs, server)
53+
@test length(sigs) == 1
54+
end
55+
end
56+
57+
@testset "definitions" begin
58+
settestdoc("""
59+
rand()
60+
func(arg) = 1
61+
func()
62+
Float64
63+
""")
64+
# @test !isempty(def_test(0, 3))
65+
@test !isempty(def_test(2, 3))
66+
@test !isempty(def_test(3, 3))
67+
end
68+
69+
@testset "references" begin
70+
settestdoc("""
71+
func(arg) = 1
72+
func()
73+
""")
74+
@test length(ref_test(1, 2)) == 2
75+
end
76+
77+
@testset "rename" begin
78+
settestdoc("""
79+
func(arg) = 1
80+
func()
81+
""")
82+
@test length(rename_test(0, 2).documentChanges[1].edits) == 2
83+
end
84+
85+
@testset "get_file_loc" begin
86+
doc = settestdoc("""
87+
func(arg) = 1
88+
func()
89+
""")
90+
@test LanguageServer.get_file_loc(doc.cst.args[2].args[1]) == (doc, 14)
91+
end
92+
93+
@testset "doc symbols" begin
94+
doc = settestdoc("""
95+
a = 1
96+
b = 2
97+
function func() end
98+
""")
99+
@test all(item.name in ("a", "b", "func") for item in LanguageServer.textDocument_documentSymbol_request(LanguageServer.DocumentSymbolParams(LanguageServer.TextDocumentIdentifier("testdoc"), missing, missing), server, server.jr_endpoint))
100+
end

test/requests/hover.jl

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
hover_test(line, char) = LanguageServer.textDocument_hover_request(LanguageServer.TextDocumentPositionParams(LanguageServer.TextDocumentIdentifier("testdoc"), LanguageServer.Position(line, char)), server, server.jr_endpoint)
2+
3+
settestdoc("""
4+
1234
5+
Base
6+
+
7+
vari = 1234
8+
\"\"\"
9+
Text
10+
\"\"\"
11+
function func(arg) end
12+
func() = nothing
13+
module M end
14+
struct T end
15+
mutable struct T end
16+
for i = 1:1 end
17+
while true end
18+
begin end
19+
sin()
20+
struct S
21+
a
22+
b
23+
c
24+
d
25+
e
26+
f
27+
g
28+
end
29+
S(a,b,c,d,e,f,g)
30+
""")
31+
32+
@test hover_test(0, 1) === nothing
33+
@test hover_test(1, 1) !== nothing
34+
@test hover_test(2, 1) !== nothing
35+
@test hover_test(3, 1) !== nothing
36+
@test hover_test(7, 11) !== nothing
37+
@test hover_test(8, 2) !== nothing
38+
@test hover_test(7, 16) !== nothing
39+
@test hover_test(7, 20) !== nothing
40+
@test hover_test(9, 11) !== nothing
41+
@test hover_test(10, 11) !== nothing
42+
@test hover_test(11, 18) !== nothing
43+
@test hover_test(12, 14) !== nothing
44+
@test hover_test(13, 13) !== nothing
45+
@test hover_test(14, 7) !== nothing
46+
@test hover_test(15, 5) !== nothing
47+
@test hover_test(25, 15) !== nothing

test/requests/misc.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
@testset "getCurrentBlockRange" begin
2+
doc = settestdoc("ab")
3+
4+
res = (LanguageServer.Position(0, 0), LanguageServer.Position(0, 2), LanguageServer.Position(0, 2))
5+
6+
@test LanguageServer.julia_getCurrentBlockRange_request(LanguageServer.VersionedTextDocumentPositionParams(LanguageServer.TextDocumentIdentifier("testdoc"), 0,LanguageServer.Position(0, 0)), server, server.jr_endpoint) == res
7+
8+
@test LanguageServer.julia_getCurrentBlockRange_request(LanguageServer.VersionedTextDocumentPositionParams(LanguageServer.TextDocumentIdentifier("testdoc"), 0,LanguageServer.Position(0, 1)), server, server.jr_endpoint) == res
9+
10+
@test LanguageServer.julia_getCurrentBlockRange_request(LanguageServer.VersionedTextDocumentPositionParams(LanguageServer.TextDocumentIdentifier("testdoc"), 0,LanguageServer.Position(0, 2)), server, server.jr_endpoint) == res
11+
end
12+

test/requests/textdocument.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
empty!(server._documents)
2+
3+
LanguageServer.textDocument_didOpen_notification(LanguageServer.DidOpenTextDocumentParams(LanguageServer.TextDocumentItem("none", "julia", 0, "")), server, server.jr_endpoint)
4+
@test LanguageServer.hasdocument(server, LanguageServer.URI2("none"))
5+
6+
LanguageServer.textDocument_didOpen_notification(LanguageServer.DidOpenTextDocumentParams(LanguageServer.TextDocumentItem("none", "julia", 0, "")), server, server.jr_endpoint)
7+
@test LanguageServer.hasdocument(server, LanguageServer.URI2("none"))
8+
9+
LanguageServer.textDocument_didSave_notification(LanguageServer.DidSaveTextDocumentParams(LanguageServer.TextDocumentIdentifier("none"), ""), server, server.jr_endpoint)
10+
11+
LanguageServer.textDocument_didChange_notification(LanguageServer.DidChangeTextDocumentParams(LanguageServer.VersionedTextDocumentIdentifier("none", 0),[LanguageServer.TextDocumentContentChangeEvent(missing, missing, "ran")]), server, server.jr_endpoint)
12+
13+
14+
LanguageServer.textDocument_didClose_notification(LanguageServer.DidCloseTextDocumentParams(LanguageServer.TextDocumentIdentifier("none")), server, server.jr_endpoint)
15+
@test !LanguageServer.hasdocument(server, LanguageServer.URI2("none"))

0 commit comments

Comments
 (0)