diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 19:55:48 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-14 19:55:48 +0000 |
commit | 8be448d3881909fb0ce4b033cad71aa7575de0aa (patch) | |
tree | da33caff06645347a08c3c9c56dd703e4acb5aa3 /tests/python/requests | |
parent | Initial commit. (diff) | |
download | lsprotocol-8be448d3881909fb0ce4b033cad71aa7575de0aa.tar.xz lsprotocol-8be448d3881909fb0ce4b033cad71aa7575de0aa.zip |
Adding upstream version 2023.0.0.upstream/2023.0.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/python/requests')
3 files changed, 545 insertions, 0 deletions
diff --git a/tests/python/requests/test_initilize_request.py b/tests/python/requests/test_initilize_request.py new file mode 100644 index 0000000..1dc259c --- /dev/null +++ b/tests/python/requests/test_initilize_request.py @@ -0,0 +1,406 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import json +import uuid + +import hamcrest +import jsonrpc +import pytest + +ID = str(uuid.uuid4()) +INITIALIZE_PARAMS = { + "processId": 1105947, + "rootPath": "/home/user/src/Personal/jedi-language-server", + "rootUri": "file:///home/user/src/Personal/jedi-language-server", + "capabilities": { + "workspace": { + "applyEdit": True, + "workspaceEdit": { + "documentChanges": True, + "resourceOperations": ["create", "rename", "delete"], + "failureHandling": "undo", + "normalizesLineEndings": True, + "changeAnnotationSupport": {"groupsOnLabel": False}, + }, + "didChangeConfiguration": {"dynamicRegistration": True}, + "didChangeWatchedFiles": { + "dynamicRegistration": True, + "relativePatternSupport": True, + }, + "codeLens": {"refreshSupport": True}, + "executeCommand": {"dynamicRegistration": True}, + "configuration": True, + "fileOperations": { + "dynamicRegistration": True, + "didCreate": True, + "didRename": True, + "didDelete": True, + "willCreate": True, + "willRename": True, + "willDelete": True, + }, + "semanticTokens": {"refreshSupport": True}, + "inlayHint": {"refreshSupport": True}, + "inlineValue": {"refreshSupport": True}, + "diagnostics": {"refreshSupport": True}, + "symbol": { + "dynamicRegistration": True, + "symbolKind": { + "valueSet": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + ] + }, + "tagSupport": {"valueSet": [1]}, + "resolveSupport": {"properties": ["location.range"]}, + }, + "workspaceFolders": True, + }, + "textDocument": { + "publishDiagnostics": { + "relatedInformation": True, + "versionSupport": True, + "tagSupport": {"valueSet": [1, 2]}, + "codeDescriptionSupport": True, + "dataSupport": True, + }, + "synchronization": { + "dynamicRegistration": True, + "willSave": True, + "willSaveWaitUntil": True, + "didSave": True, + }, + "completion": { + "dynamicRegistration": True, + "contextSupport": True, + "completionItem": { + "snippetSupport": True, + "commitCharactersSupport": True, + "documentationFormat": ["markdown", "plaintext"], + "deprecatedSupport": True, + "preselectSupport": True, + "insertReplaceSupport": True, + "tagSupport": {"valueSet": [1]}, + "resolveSupport": { + "properties": ["documentation", "detail", "additionalTextEdits"] + }, + "labelDetailsSupport": True, + "insertTextModeSupport": {"valueSet": [1, 2]}, + }, + "completionItemKind": { + "valueSet": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + ] + }, + "insertTextMode": 2, + "completionList": { + "itemDefaults": [ + "commitCharacters", + "editRange", + "insertTextFormat", + "insertTextMode", + ] + }, + }, + "hover": { + "dynamicRegistration": True, + "contentFormat": ["markdown", "plaintext"], + }, + "signatureHelp": { + "dynamicRegistration": True, + "contextSupport": True, + "signatureInformation": { + "documentationFormat": ["markdown", "plaintext"], + "activeParameterSupport": True, + "parameterInformation": {"labelOffsetSupport": True}, + }, + }, + "references": {"dynamicRegistration": True}, + "definition": {"dynamicRegistration": True, "linkSupport": True}, + "documentHighlight": {"dynamicRegistration": True}, + "documentSymbol": { + "dynamicRegistration": True, + "symbolKind": { + "valueSet": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + ] + }, + "hierarchicalDocumentSymbolSupport": True, + "tagSupport": {"valueSet": [1]}, + "labelSupport": True, + }, + "codeAction": { + "dynamicRegistration": True, + "isPreferredSupport": True, + "disabledSupport": True, + "dataSupport": True, + "honorsChangeAnnotations": False, + "resolveSupport": {"properties": ["edit"]}, + "codeActionLiteralSupport": { + "codeActionKind": { + "valueSet": [ + "", + "quickfix", + "refactor", + "refactor.extract", + "refactor.inline", + "refactor.rewrite", + "source", + "source.organizeImports", + ] + } + }, + }, + "codeLens": {"dynamicRegistration": True}, + "formatting": {"dynamicRegistration": True}, + "rangeFormatting": {"dynamicRegistration": True}, + "onTypeFormatting": {"dynamicRegistration": True}, + "rename": { + "dynamicRegistration": True, + "prepareSupport": True, + "honorsChangeAnnotations": True, + "prepareSupportDefaultBehavior": 1, + }, + "documentLink": {"dynamicRegistration": True, "tooltipSupport": True}, + "typeDefinition": {"dynamicRegistration": True, "linkSupport": True}, + "implementation": {"dynamicRegistration": True, "linkSupport": True}, + "declaration": {"dynamicRegistration": True, "linkSupport": True}, + "colorProvider": {"dynamicRegistration": True}, + "foldingRange": { + "dynamicRegistration": True, + "rangeLimit": 5000, + "lineFoldingOnly": True, + "foldingRangeKind": {"valueSet": ["comment", "imports", "region"]}, + "foldingRange": {"collapsedText": False}, + }, + "selectionRange": {"dynamicRegistration": True}, + "callHierarchy": {"dynamicRegistration": True}, + "linkedEditingRange": {"dynamicRegistration": True}, + "semanticTokens": { + "dynamicRegistration": True, + "tokenTypes": [ + "namespace", + "type", + "class", + "enum", + "interface", + "struct", + "typeParameter", + "parameter", + "variable", + "property", + "enumMember", + "event", + "function", + "method", + "macro", + "keyword", + "modifier", + "comment", + "string", + "number", + "regexp", + "decorator", + "operator", + ], + "tokenModifiers": [ + "declaration", + "definition", + "readonly", + "static", + "deprecated", + "abstract", + "async", + "modification", + "documentation", + "defaultLibrary", + ], + "formats": ["relative"], + "requests": {"range": True, "full": {"delta": True}}, + "multilineTokenSupport": False, + "overlappingTokenSupport": False, + "serverCancelSupport": True, + "augmentsSyntaxTokens": True, + }, + "inlayHint": { + "dynamicRegistration": True, + "resolveSupport": { + "properties": [ + "tooltip", + "textEdits", + "label.tooltip", + "label.location", + "label.command", + ] + }, + }, + "inlineValue": {"dynamicRegistration": True}, + "diagnostic": {"dynamicRegistration": True, "relatedDocumentSupport": True}, + "typeHierarchy": {"dynamicRegistration": True}, + }, + "window": { + "showMessage": {"messageActionItem": {"additionalPropertiesSupport": True}}, + "showDocument": {"support": True}, + "workDoneProgress": True, + }, + "general": { + "regularExpressions": {"engine": "ECMAScript", "version": "ES2020"}, + "markdown": {"parser": "marked", "version": "4.0.10"}, + "positionEncodings": ["utf-16"], + "staleRequestSupport": { + "cancel": True, + "retryOnContentModified": [ + "textDocument/inlayHint", + "textDocument/semanticTokens/full", + "textDocument/semanticTokens/range", + "textDocument/semanticTokens/full/delta", + ], + }, + }, + }, + "initializationOptions": { + "enable": True, + "startupMessage": False, + "trace": {"server": "verbose"}, + "jediSettings": { + "autoImportModules": ["pygls"], + "caseInsensitiveCompletion": True, + "debug": False, + }, + "executable": {"args": [], "command": "jedi-language-server"}, + "codeAction": { + "nameExtractFunction": "jls_extract_def", + "nameExtractVariable": "jls_extract_var", + }, + "completion": { + "disableSnippets": False, + "resolveEagerly": False, + "ignorePatterns": [], + }, + "diagnostics": { + "enable": True, + "didOpen": True, + "didChange": True, + "didSave": True, + }, + "hover": { + "enable": True, + "disable": { + "class": {"all": False, "names": [], "fullNames": []}, + "function": {"all": False, "names": [], "fullNames": []}, + "instance": {"all": False, "names": [], "fullNames": []}, + "keyword": {"all": False, "names": [], "fullNames": []}, + "module": {"all": False, "names": [], "fullNames": []}, + "param": {"all": False, "names": [], "fullNames": []}, + "path": {"all": False, "names": [], "fullNames": []}, + "property": {"all": False, "names": [], "fullNames": []}, + "statement": {"all": False, "names": [], "fullNames": []}, + }, + }, + "workspace": { + "extraPaths": [], + "symbols": { + "maxSymbols": 20, + "ignoreFolders": [".nox", ".tox", ".venv", "__pycache__", "venv"], + }, + }, + }, + "trace": "verbose", + "workspaceFolders": [ + { + "uri": "file:///home/user/src/Personal/jedi-language-server", + "name": "jedi-language-server", + } + ], + "locale": "en_US", + "clientInfo": {"name": "coc.nvim", "version": "0.0.82"}, +} + + +TEST_DATA = [ + {"id": ID, "params": INITIALIZE_PARAMS, "method": "initialize", "jsonrpc": "2.0"}, +] + + +@pytest.mark.parametrize("index", list(range(0, len(TEST_DATA)))) +def test_initialize_request_params(index): + data = TEST_DATA[index] + data_str = json.dumps(data) + parsed = jsonrpc.from_json(data_str) + actual_str = jsonrpc.to_json(parsed) + actual_data = json.loads(actual_str) + hamcrest.assert_that(actual_data, hamcrest.is_(data)) diff --git a/tests/python/requests/test_inlay_hint_resolve_request.py b/tests/python/requests/test_inlay_hint_resolve_request.py new file mode 100644 index 0000000..6dc9f42 --- /dev/null +++ b/tests/python/requests/test_inlay_hint_resolve_request.py @@ -0,0 +1,86 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import json +import uuid + +import hamcrest +import jsonrpc +import pytest +from cattrs.errors import ClassValidationError + +ID = str(uuid.uuid4()) + +TEST_DATA = [ + ( + { + "id": ID, + "method": "inlayHint/resolve", + "params": { + "position": {"line": 6, "character": 5}, + "label": "a label", + "kind": 1, + "paddingLeft": False, + "paddingRight": True, + }, + "jsonrpc": "2.0", + }, + json.dumps( + { + "id": ID, + "params": { + "position": {"line": 6, "character": 5}, + "label": "a label", + "kind": 1, + "paddingLeft": False, + "paddingRight": True, + }, + "method": "inlayHint/resolve", + "jsonrpc": "2.0", + } + ), + ), + ( + { + "id": ID, + "method": "inlayHint/resolve", + "params": { + "position": {"line": 6, "character": 5}, + "label": [ + {"value": "part 1"}, + {"value": "part 2", "tooltip": "a tooltip"}, + ], + "kind": 1, + "paddingLeft": False, + "paddingRight": True, + }, + "jsonrpc": "2.0", + }, + json.dumps( + { + "id": ID, + "params": { + "position": {"line": 6, "character": 5}, + "label": [ + {"value": "part 1"}, + {"value": "part 2", "tooltip": "a tooltip"}, + ], + "kind": 1, + "paddingLeft": False, + "paddingRight": True, + }, + "method": "inlayHint/resolve", + "jsonrpc": "2.0", + } + ), + ), +] + + +@pytest.mark.parametrize("index", list(range(0, len(TEST_DATA)))) +def test_inlay_hint_resolve_request_serialization(index): + data, expected = TEST_DATA[index] + data_str = json.dumps(data) + parsed = jsonrpc.from_json(data_str) + actual_str = jsonrpc.to_json(parsed) + hamcrest.assert_that(actual_str, hamcrest.is_(expected)) diff --git a/tests/python/requests/test_workspace_sematic_tokens_refresh.py b/tests/python/requests/test_workspace_sematic_tokens_refresh.py new file mode 100644 index 0000000..fd1c64a --- /dev/null +++ b/tests/python/requests/test_workspace_sematic_tokens_refresh.py @@ -0,0 +1,53 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import json +import uuid + +import hamcrest +import jsonrpc +import pytest +from cattrs.errors import ClassValidationError + +ID = str(uuid.uuid4()) + +TEST_DATA = [ + ( + {"id": ID, "method": "workspace/semanticTokens/refresh", "jsonrpc": "2.0"}, + json.dumps( + {"id": ID, "method": "workspace/semanticTokens/refresh", "jsonrpc": "2.0"} + ), + ), + ( + { + "id": ID, + "method": "workspace/semanticTokens/refresh", + "params": None, + "jsonrpc": "2.0", + }, + json.dumps( + {"id": ID, "method": "workspace/semanticTokens/refresh", "jsonrpc": "2.0"} + ), + ), +] + + +@pytest.mark.parametrize("index", list(range(0, len(TEST_DATA)))) +def test_workspace_sematic_tokens_refresh_request_serialization(index): + data, expected = TEST_DATA[index] + data_str = json.dumps(data) + parsed = jsonrpc.from_json(data_str) + actual_str = jsonrpc.to_json(parsed) + hamcrest.assert_that(actual_str, hamcrest.is_(expected)) + + +@pytest.mark.parametrize( + "data", + [ + json.dumps({}), # missing method and jsonrpc + json.dumps({"method": "invalid"}), # invalid method type + ], +) +def test_workspace_sematic_tokens_refresh_request_invalid(data): + with pytest.raises((ClassValidationError, KeyError)): + jsonrpc.from_json(data) |