diff options
Diffstat (limited to 'tests/test_language_server.py')
-rw-r--r-- | tests/test_language_server.py | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/tests/test_language_server.py b/tests/test_language_server.py new file mode 100644 index 0000000..5271ff5 --- /dev/null +++ b/tests/test_language_server.py @@ -0,0 +1,144 @@ +############################################################################ +# Copyright(c) Open Law Library. All rights reserved. # +# See ThirdPartyNotices.txt in the project root for additional notices. # +# # +# Licensed under the Apache License, Version 2.0 (the "License") # +# you may not use this file except in compliance with the License. # +# You may obtain a copy of the License at # +# # +# http: // www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +############################################################################ +import pathlib +from time import sleep + +import pytest + +from pygls import IS_PYODIDE +from lsprotocol.types import ( + INITIALIZE, + TEXT_DOCUMENT_DID_OPEN, + WORKSPACE_EXECUTE_COMMAND, +) +from lsprotocol.types import ( + ClientCapabilities, + DidOpenTextDocumentParams, + ExecuteCommandParams, + InitializeParams, + TextDocumentItem, +) +from pygls.protocol import LanguageServerProtocol +from pygls.server import LanguageServer +from . import CMD_ASYNC, CMD_SYNC, CMD_THREAD + + +def _initialize_server(server): + server.lsp.lsp_initialize( + InitializeParams( + process_id=1234, + root_uri=pathlib.Path(__file__).parent.as_uri(), + capabilities=ClientCapabilities(), + ) + ) + + +def test_bf_initialize(client_server): + client, server = client_server + root_uri = pathlib.Path(__file__).parent.as_uri() + process_id = 1234 + + response = client.lsp.send_request( + INITIALIZE, + InitializeParams( + process_id=process_id, + root_uri=root_uri, + capabilities=ClientCapabilities(), + ), + ).result() + + assert server.process_id == process_id + assert server.workspace.root_uri == root_uri + assert response.capabilities is not None + + +def test_bf_text_document_did_open(client_server): + client, server = client_server + + _initialize_server(server) + + client.lsp.notify( + TEXT_DOCUMENT_DID_OPEN, + DidOpenTextDocumentParams( + text_document=TextDocumentItem( + uri=__file__, language_id="python", version=1, text="test" + ) + ), + ) + + sleep(1) + + assert len(server.lsp.workspace.text_documents) == 1 + + document = server.workspace.get_text_document(__file__) + assert document.uri == __file__ + assert document.version == 1 + assert document.source == "test" + assert document.language_id == "python" + + +@pytest.mark.skipif(IS_PYODIDE, reason="threads are not available in pyodide.") +def test_command_async(client_server): + client, server = client_server + + is_called, thread_id = client.lsp.send_request( + WORKSPACE_EXECUTE_COMMAND, ExecuteCommandParams(command=CMD_ASYNC) + ).result() + + assert is_called + assert thread_id == server.thread_id + + +@pytest.mark.skipif(IS_PYODIDE, reason="threads are not available in pyodide.") +def test_command_sync(client_server): + client, server = client_server + + is_called, thread_id = client.lsp.send_request( + WORKSPACE_EXECUTE_COMMAND, ExecuteCommandParams(command=CMD_SYNC) + ).result() + + assert is_called + assert thread_id == server.thread_id + + +@pytest.mark.skipif(IS_PYODIDE, reason="threads are not available in pyodide.") +def test_command_thread(client_server): + client, server = client_server + + is_called, thread_id = client.lsp.send_request( + WORKSPACE_EXECUTE_COMMAND, ExecuteCommandParams(command=CMD_THREAD) + ).result() + + assert is_called + assert thread_id != server.thread_id + + +def test_allow_custom_protocol_derived_from_lsp(): + class CustomProtocol(LanguageServerProtocol): + pass + + server = LanguageServer("pygls-test", "v1", protocol_cls=CustomProtocol) + + assert isinstance(server.lsp, CustomProtocol) + + +def test_forbid_custom_protocol_not_derived_from_lsp(): + class CustomProtocol: + pass + + with pytest.raises(TypeError): + LanguageServer("pygls-test", "v1", protocol_cls=CustomProtocol) |