Skip to content

Commit 9b0e19f

Browse files
committed
parameterize conftest protocol to be able to test lsp protocol with different clientcapabilities
1 parent 1353422 commit 9b0e19f

File tree

8 files changed

+291
-239
lines changed

8 files changed

+291
-239
lines changed

robotcode/language_server/common/lsp_types.py

Lines changed: 229 additions & 218 deletions
Large diffs are not rendered by default.

robotcode/language_server/common/parts/folding_range.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from ..text_document import TextDocument
1818

1919
if TYPE_CHECKING:
20-
from ..protocol import LanguageServerProtocol
20+
from ..protocol import LanguageServerProtocol # pragma: no cover
2121

2222
from .protocol_part import LanguageServerProtocolPart
2323

@@ -30,7 +30,7 @@ def __init__(self, parent: LanguageServerProtocol) -> None:
3030
super().__init__(parent)
3131

3232
@async_tasking_event
33-
async def collect(sender, document: TextDocument) -> Optional[List[FoldingRange]]:
33+
async def collect(sender, document: TextDocument) -> Optional[List[FoldingRange]]: # pragma: no cover
3434
...
3535

3636
def extend_capabilities(self, capabilities: ServerCapabilities) -> None:

robotcode/language_server/robotframework/diagnostics/library_doc.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
import importlib
24
import importlib.util
35
import io
@@ -205,7 +207,7 @@ class KeywordArgumentDoc(Model):
205207
types: Optional[Any] = None
206208

207209
@staticmethod
208-
def from_robot(arg: Any) -> "KeywordArgumentDoc":
210+
def from_robot(arg: Any) -> KeywordArgumentDoc:
209211
from robot.running.arguments.argumentspec import ArgInfo
210212

211213
robot_arg = cast(ArgInfo, arg)

robotcode/language_server/robotframework/parts/folding_range.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from ...common.text_document import TextDocument
1010

1111
if TYPE_CHECKING:
12-
from ..protocol import RobotLanguageServerProtocol
12+
from ..protocol import RobotLanguageServerProtocol # pragma: no cover
1313

1414
from .protocol_part import RobotLanguageServerProtocolPart
1515

tests/robotcode/language_server/robotframework/conftest.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
import dataclasses
23
from pathlib import Path
34
from typing import Any, AsyncGenerator, Generator, cast
45

@@ -25,6 +26,7 @@
2526
)
2627
from robotcode.language_server.robotframework.server import RobotLanguageServer
2728
from robotcode.utils.dataclasses import as_dict
29+
from tests.robotcode.language_server.robotframework.tools import generate_test_id
2830

2931

3032
@pytest.fixture(scope="function")
@@ -36,20 +38,26 @@ def event_loop() -> Generator[asyncio.AbstractEventLoop, None, None]:
3638
loop.close()
3739

3840

39-
@pytest.fixture(scope="function")
40-
async def protocol(
41-
event_loop: asyncio.AbstractEventLoop, request: Any
42-
) -> AsyncGenerator[RobotLanguageServerProtocol, None]:
41+
@pytest.fixture(scope="function", ids=generate_test_id)
42+
@pytest.mark.usefixtures("event_loop")
43+
async def protocol(request: Any) -> AsyncGenerator[RobotLanguageServerProtocol, None]:
4344
root_path = Path().resolve()
4445
server = RobotLanguageServer()
4546
try:
47+
client_capas = ClientCapabilities(
48+
text_document=TextDocumentClientCapabilities(
49+
hover=HoverClientCapabilities(content_format=[MarkupKind.MARKDOWN, MarkupKind.PLAINTEXT]),
50+
folding_range=FoldingRangeClientCapabilities(range_limit=0, line_folding_only=False),
51+
)
52+
)
53+
4654
protocol = RobotLanguageServerProtocol(server)
4755
await protocol._initialize(
48-
ClientCapabilities(
49-
text_document=TextDocumentClientCapabilities(
50-
hover=HoverClientCapabilities(content_format=[MarkupKind.MARKDOWN, MarkupKind.PLAINTEXT]),
51-
folding_range=FoldingRangeClientCapabilities(range_limit=0, line_folding_only=False),
52-
)
56+
dataclasses.replace(
57+
client_capas,
58+
**(
59+
{k: v for k, v in vars(request.param).items() if v is not None} if hasattr(request, "param") else {}
60+
),
5361
),
5462
root_path=str(root_path),
5563
root_uri=root_path.as_uri(),
@@ -77,7 +85,8 @@ async def protocol(
7785

7886

7987
@pytest.fixture(scope="function")
80-
async def test_document(event_loop: asyncio.AbstractEventLoop, request: Any) -> AsyncGenerator[TextDocument, None]:
88+
@pytest.mark.usefixtures("event_loop")
89+
async def test_document(request: Any) -> AsyncGenerator[TextDocument, None]:
8190
data_path = Path(request.param)
8291
data = data_path.read_text()
8392

tests/robotcode/language_server/robotframework/parts/data/foldingrange.robot

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
*** Settings ***
2-
#^ Settings Start: any(e for e in result if e.start_line == line and e.kind=='section')
2+
#^ Settings Start: any(e for e in result if e.start_line == line and (e.start_character is None or e.start_character==0) and e.kind=='section')
33
Documentation Hallo Welt
44
... was geht
55
66
*** Test Cases ***
7-
#^ Variables End: any(e for e in result if e.end_line == line - 1 and e.kind=='section')
7+
#^ Settings End: any(e for e in result if e.end_line == line - 1 and (e.end_character is None or e.end_character>0) and e.kind=='section')
88
#^ Test Cases Start: any(e for e in result if e.start_line == line and e.kind=='section')
99
First
1010
#^ Testcase Start: any(e for e in result if e.start_line == line and e.kind=='testcase')

tests/robotcode/language_server/robotframework/parts/test_foldingrange.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
import re
22
from pathlib import Path
3+
from typing import Any, Generator, Iterable, Tuple, Union
34

45
import pytest
56

6-
from robotcode.language_server.common.lsp_types import FoldingRange
7+
from robotcode.language_server.common.lsp_types import (
8+
ClientCapabilities,
9+
FoldingRange,
10+
FoldingRangeClientCapabilities,
11+
TextDocumentClientCapabilities,
12+
)
713
from robotcode.language_server.common.text_document import TextDocument
814
from robotcode.language_server.robotframework.protocol import (
915
RobotLanguageServerProtocol,
@@ -16,10 +22,32 @@
1622
)
1723

1824

25+
def prepend_protocol_data(
26+
protocol: Iterable[Any], data: Iterable[Union[Tuple[Any, Path, GeneratedTestData], Any]]
27+
) -> Generator[Union[Tuple[Any, Path, GeneratedTestData], Any], None, None]:
28+
for p in protocol:
29+
for d in data:
30+
yield (p, *d)
31+
32+
1933
@pytest.mark.parametrize(
20-
("test_document", "data"),
21-
generate_tests_from_source_document(Path(Path(__file__).parent, "data/foldingrange.robot")),
22-
indirect=["test_document"],
34+
("protocol", "test_document", "data"),
35+
prepend_protocol_data(
36+
[
37+
ClientCapabilities(
38+
text_document=TextDocumentClientCapabilities(
39+
folding_range=FoldingRangeClientCapabilities(line_folding_only=True),
40+
)
41+
),
42+
ClientCapabilities(
43+
text_document=TextDocumentClientCapabilities(
44+
folding_range=FoldingRangeClientCapabilities(line_folding_only=False),
45+
)
46+
),
47+
],
48+
list(generate_tests_from_source_document(Path(Path(__file__).parent, "data/foldingrange.robot"))),
49+
),
50+
indirect=["protocol", "test_document"],
2351
ids=generate_test_id,
2452
)
2553
@pytest.mark.asyncio

tests/robotcode/language_server/robotframework/tools.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import dataclasses
12
import re
23
from pathlib import Path
34
from typing import Any, Generator, NamedTuple, Tuple, Union
@@ -54,7 +55,8 @@ def generate_tests_from_source_document(
5455
def generate_test_id(params: Any) -> Any:
5556
if isinstance(params, GeneratedTestData):
5657
return f"{params.line}-{params.character}-{params.name}"
57-
58+
if dataclasses.is_dataclass(params):
59+
return repr(params)
5860
if isinstance(params, Path):
5961
return params.name
6062

0 commit comments

Comments
 (0)