Skip to content

Commit 67bb805

Browse files
committed
Move more pylsp test helpers to class methods
1 parent 76cc470 commit 67bb805

File tree

7 files changed

+64
-64
lines changed

7 files changed

+64
-64
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ celerybeat-schedule
7979
.env
8080

8181
# virtualenv
82+
.venv/
8283
venv/
8384
ENV/
8485

@@ -103,4 +104,6 @@ testsuite/.als/inout.txt
103104
# Temporary testsuite's files and directories
104105
testsuite/ada_lsp/project_symlinks/link
105106

106-
out
107+
# Temporary and output directories of e3-testsuite
108+
tmp/
109+
out/

testsuite/ada_lsp/called_by_dispatching/test.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,15 @@
44
URI,
55
ALSLanguageClient,
66
assertLocationsList,
7-
didOpenTextDocumentParams,
87
test,
98
)
109

1110

1211
@test()
1312
async def test_called_by(lsp: ALSLanguageClient):
1413
# Send a didOpen for main.adb
15-
open_params, main_adb_uri = didOpenTextDocumentParams("main.adb")
14+
main_adb_uri = lsp.didOpenFile("main.adb")
1615
root_ads_uri = URI("root.ads")
17-
lsp.text_document_did_open(open_params)
1816

1917
# Send a textDocument/prepareCallHierarchy request
2018
result1 = await lsp.prepareCallHierarchy(main_adb_uri, 7, 4)

testsuite/ada_lsp/formatting.errors_on_invalid_code/test.py renamed to testsuite/ada_lsp/formatting_errors_on_invalid_code/test.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
return errors when the code is syntactically invalid.
44
"""
55

6+
import pygls.exceptions
7+
from drivers.pylsp import ALSLanguageClient, assertEqual, test
68
from lsprotocol.types import (
79
DidChangeConfigurationParams,
810
DocumentFormattingParams,
@@ -12,20 +14,12 @@
1214
Range,
1315
TextDocumentIdentifier,
1416
)
15-
import pygls.exceptions
16-
from drivers.pylsp import (
17-
ALSLanguageClient,
18-
didOpenTextDocumentParams,
19-
test,
20-
assertEqual,
21-
)
2217

2318

2419
@test()
2520
async def test_called_by(lsp: ALSLanguageClient):
2621
# Send a didOpen for main.adb
27-
open_params, main_adb_uri = didOpenTextDocumentParams("main.adb")
28-
lsp.text_document_did_open(open_params)
22+
main_adb_uri = lsp.didOpenFile("main.adb")
2923

3024
# Test with GNATformat formatting backend
3125
lsp.workspace_did_change_configuration(

testsuite/drivers/pylsp.py

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,19 @@
1010
import sys
1111
import urllib
1212
import urllib.parse
13-
from pathlib import Path
14-
from typing import (
15-
Any,
16-
Awaitable,
17-
Callable,
18-
Literal,
19-
Sequence,
20-
Type,
21-
TypedDict,
22-
)
2313
import uuid
2414
import warnings
15+
from pathlib import Path
16+
from typing import Any, Awaitable, Callable, Literal, Sequence, Type, TypedDict
2517

2618
import attrs
2719
import lsprotocol.converters
2820
import lsprotocol.types
29-
from lsprotocol import types
30-
from pygls.client import JsonRPCClient
31-
from pygls.protocol import default_converter
32-
from pytest_lsp import (
33-
ClientServerConfig,
34-
LanguageClient,
35-
LanguageClientProtocol,
36-
LspSpecificationWarning,
37-
)
3821
from drivers import ALSTestDriver
3922
from e3.os.process import Run, command_line_image
4023
from e3.testsuite.driver.classic import ProcessResult, TestAbortWithFailure
4124
from e3.testsuite.result import TestStatus
25+
from lsprotocol import types
4226
from lsprotocol.types import (
4327
CallHierarchyIncomingCall,
4428
CallHierarchyIncomingCallsParams,
@@ -57,6 +41,14 @@
5741
TextDocumentItem,
5842
WorkDoneProgressEnd,
5943
)
44+
from pygls.client import JsonRPCClient
45+
from pygls.protocol import default_converter
46+
from pytest_lsp import (
47+
ClientServerConfig,
48+
LanguageClient,
49+
LanguageClientProtocol,
50+
LspSpecificationWarning,
51+
)
6052

6153
LOG = logging.getLogger(__name__)
6254
logger = LOG
@@ -342,6 +334,21 @@ def didChangeConfig(self, settings: ALSSettings) -> None:
342334
DidChangeConfigurationParams(settings={"ada": settings})
343335
)
344336

337+
def didOpenFile(self, src_path: Path | str, language_id="ada", version=0) -> str:
338+
"""Send a textDocument/didOpen notification for a file on disk. The content of
339+
the file is automatically read and sent in the notification. The URI is returned
340+
for later use in other requests about the file.
341+
"""
342+
uri = URI(src_path)
343+
344+
self.text_document_did_open(
345+
DidOpenTextDocumentParams(
346+
TextDocumentItem(uri, language_id, version, Path(src_path).read_text())
347+
)
348+
)
349+
350+
return uri
351+
345352
def didOpenVirtual(
346353
self, uri: str | None = None, language_id="ada", version=0, text: str = ""
347354
) -> str:
@@ -422,16 +429,42 @@ async def prepareCallHierarchy(
422429
self, uri: str, line_one_based: int, char_one_based: int
423430
):
424431
return await self.text_document_prepare_call_hierarchy_async(
425-
callHierarchyPrepareParams(uri, line_one_based, char_one_based)
432+
CallHierarchyPrepareParams(
433+
TextDocumentIdentifier(uri), Pos(line_one_based, char_one_based)
434+
)
426435
)
427436

428437
async def callHierarchyIncomingCalls(
429-
self, uri: str, line_one_based: int, char_on_based: int
438+
self, uri: str, line_one_based: int, char_one_based: int
430439
):
440+
rng = RangeZero(line_one_based, char_one_based)
431441
return await self.call_hierarchy_incoming_calls_async(
432-
callHierarchyIncomingCallsParams(uri, line_one_based, char_on_based)
442+
CallHierarchyIncomingCallsParams(
443+
CallHierarchyItem(
444+
name="",
445+
kind=SymbolKind.Function,
446+
uri=uri,
447+
range=rng,
448+
selection_range=rng,
449+
)
450+
)
433451
)
434452

453+
def assertEqual(self, actual: Any, expected: Any) -> None:
454+
"""Raise an AssertionError if actual != expected."""
455+
assertEqual(actual, expected)
456+
457+
def assertLocationsList(
458+
self,
459+
actual: Sequence[CallHierarchyItem | CallHierarchyIncomingCall],
460+
expected: list[tuple[str, int]],
461+
) -> None:
462+
"""Assert the content of a list of results from a CallHierarchy or
463+
CallHierarchyIncomingCall request. Expected results are given as a list of
464+
(<basename>, <line-one-based>) tuples.
465+
"""
466+
assertLocationsList(actual, expected)
467+
435468

436469
def als_client_factory() -> ALSLanguageClient:
437470
"""This function is an ugly copy-paste of pytest_lsp.make_test_lsp_client. It is
@@ -750,16 +783,6 @@ def do_main():
750783
run_test_file(args.test_py_path)
751784

752785

753-
def callHierarchyPrepareParams(
754-
src_uri: str, line_one_based: int, char_one_based: int
755-
) -> CallHierarchyPrepareParams:
756-
"""Shortcut for creating a CallHierarchyPrepareParams object."""
757-
return CallHierarchyPrepareParams(
758-
TextDocumentIdentifier(src_uri),
759-
Pos(line_one_based, char_one_based),
760-
)
761-
762-
763786
def Pos(line_one_based: int, char_one_based: int):
764787
"""Shortcut for creating a Position object with ONE-BASED locations."""
765788
return Position(line_one_based - 1, char_one_based - 1)
@@ -773,24 +796,6 @@ def RangeZero(line_one_based: int, char_one_based: int):
773796
return Range(pos, pos)
774797

775798

776-
def callHierarchyIncomingCallsParams(
777-
src_uri: str, line_one_based: int, char_one_based: int
778-
) -> CallHierarchyIncomingCallsParams:
779-
"""Shortcut for creating a CallHierarchyIncomingCallsParams object."""
780-
rng = RangeZero(line_one_based, char_one_based)
781-
param = CallHierarchyIncomingCallsParams(
782-
item=CallHierarchyItem(
783-
name="",
784-
kind=SymbolKind.Function,
785-
uri=src_uri,
786-
range=rng,
787-
selection_range=rng,
788-
)
789-
)
790-
791-
return param
792-
793-
794799
def didOpenTextDocumentParams(
795800
src_path: Path | str,
796801
) -> tuple[DidOpenTextDocumentParams, str]:
@@ -810,7 +815,7 @@ def URI(src_path: Path | str) -> str:
810815
"""Create a URI for the given file path."""
811816
src_abs = Path(src_path).resolve()
812817

813-
# Replace backslashs with forward slashes to avoid too much quoting in URIs
818+
# Replace back slashes with forward slashes to avoid too much quoting in URIs
814819
src_abs_str = str(src_abs).replace("\\", "/")
815820

816821
quoted = urllib.parse.quote(src_abs_str)

0 commit comments

Comments
 (0)