summaryrefslogtreecommitdiffstats
path: root/tests/test_language_server.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_language_server.py')
-rw-r--r--tests/test_language_server.py144
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)