From 9e7f7ce82f30622964119f0f1098832e5bc0aa32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9rome=20Perrin?= Date: Sat, 16 Jul 2022 22:40:54 +0900 Subject: [PATCH] test_progress: test cases of server initiated progress this test was only covering client iniated progress --- tests/lsp/test_progress.py | 89 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 3 deletions(-) diff --git a/tests/lsp/test_progress.py b/tests/lsp/test_progress.py index 56656d2e..0dc05a68 100644 --- a/tests/lsp/test_progress.py +++ b/tests/lsp/test_progress.py @@ -19,7 +19,12 @@ from typing import List, Optional import pytest -from lsprotocol.types import TEXT_DOCUMENT_CODE_LENS, PROGRESS +from lsprotocol.types import ( + TEXT_DOCUMENT_CODE_LENS, + WINDOW_WORK_DONE_PROGRESS_CANCEL, + WINDOW_WORK_DONE_PROGRESS_CREATE, + PROGRESS, +) from lsprotocol.types import ( CodeLens, CodeLensParams, @@ -40,13 +45,25 @@ class ConfiguredLS(ClientServer): def __init__(self): super().__init__() self.client.notifications: List[ProgressParams] = [] + self.client.method_calls: List[WorkDoneProgressCreateParams] = [] @self.server.feature( TEXT_DOCUMENT_CODE_LENS, CodeLensOptions(resolve_provider=False, work_done_progress=True), ) async def f1(params: CodeLensParams) -> Optional[List[CodeLens]]: - token = params.work_done_token + if "client_initiated_token" in params.text_document.uri: + token = params.work_done_token + else: + assert "server_initiated_token" in params.text_document.uri + token = params.text_document.uri[len("file://") :] + if "async" in params.text_document.uri: + await self.server.progress.create_async(token) + else: + f = self.server.progress.create(token) + await asyncio.sleep(0.1) + f.result() + assert token self.server.lsp.progress.begin( token, @@ -75,6 +92,10 @@ def f2(params): WorkDoneProgressCancelParams(token=params.token), ) + @self.client.feature(WINDOW_WORK_DONE_PROGRESS_CREATE) + def f3(params: WorkDoneProgressCreateParams): + self.client.method_calls.append(params) + @ConfiguredLS.decorate() def test_capabilities(client_server): @@ -114,12 +135,48 @@ async def test_progress_notifications(client_server): assert {notif.token for notif in client.notifications} == {"token"} +@pytest.mark.skipif(IS_PYODIDE, reason="threads are not available in pyodide.") +@pytest.mark.parametrize("registration", ("sync", "async")) +@ConfiguredLS.decorate() +async def test_server_initiated_progress_notifications(client_server, registration): + client, _ = client_server + client.lsp.send_request( + TEXT_DOCUMENT_CODE_LENS, + CodeLensParams( + text_document=TextDocumentIdentifier( + uri=f"file://server_initiated_token_{registration}" + ), + work_done_token="token", + ), + ).result() + + assert [notif.value for notif in client.notifications] == [ + { + "kind": "begin", + "title": "starting", + "percentage": 0, + }, + { + "kind": "report", + "message": "doing", + "percentage": 50, + }, + {"kind": "end", "message": "done"}, + ] + assert {notif.token for notif in client.notifications} == { + f"server_initiated_token_{registration}" + } + assert [mc.token for mc in client.method_calls] == [ + f"server_initiated_token_{registration}" + ] + + @pytest.mark.skipif(IS_PYODIDE, reason="threads are not available in pyodide.") @ConfiguredLS.decorate() def test_progress_cancel_notifications(client_server): client, _ = client_server client.lsp.send_request( - CODE_LENS, + TEXT_DOCUMENT_CODE_LENS, CodeLensParams( text_document=TextDocumentIdentifier(uri="file://client_initiated_token"), work_done_token="token_with_cancellation", @@ -136,3 +193,29 @@ def test_progress_cancel_notifications(client_server): assert {notif.token for notif in client.notifications} == { "token_with_cancellation" } + + +@pytest.mark.skipif(IS_PYODIDE, reason="threads are not available in pyodide.") +@pytest.mark.parametrize("registration", ("sync", "async")) +@ConfiguredLS.decorate() +def test_server_initiated_progress_progress_cancel_notifications( + client_server, registration +): + client, _ = client_server + client.lsp.send_request( + TEXT_DOCUMENT_CODE_LENS, + CodeLensParams( + text_document=TextDocumentIdentifier( + uri=f"file://server_initiated_token_{registration}_with_cancellation" + ), + ), + ).result() + + assert [notif.value for notif in client.notifications] == [ + { + "kind": "begin", + "title": "starting", + "percentage": 0, + }, + {"kind": "end", "message": "cancelled"}, + ]