File: test_signature.py

package info (click to toggle)
python-lsp-server 1.12.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 796 kB
  • sloc: python: 7,791; sh: 12; makefile: 4
file content (106 lines) | stat: -rw-r--r-- 2,763 bytes parent folder | download
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# Copyright 2017-2020 Palantir Technologies, Inc.
# Copyright 2021- Python Language Server Contributors.

import pytest

from pylsp import uris
from pylsp.plugins import signature
from pylsp.workspace import Document

DOC_URI = uris.from_fs_path(__file__)
DOC = """import sys

def main(param1, param2):
    \"\"\" Main docstring

    Args:
        param1 (str): Docs for param1
    \"\"\"
    raise Exception()

main(
"""

MULTI_LINE_DOC = """import sys

def main(param1=None,
            param2=None,
            param3=None,
            param4=None,
            param5=None,
            param6=None,
            param7=None,
            param8=None):
    \"\"\" Main docstring

    Args:
        param1 (str): Docs for param1
    \"\"\"
    raise Exception()

main(
"""


def test_no_signature(workspace) -> None:
    # Over blank line
    sig_position = {"line": 9, "character": 0}
    doc = Document(DOC_URI, workspace, DOC)

    sigs = signature.pylsp_signature_help(doc._config, doc, sig_position)["signatures"]
    assert not sigs


def test_signature(workspace) -> None:
    # Over '( ' in main(
    sig_position = {"line": 10, "character": 5}
    doc = Document(DOC_URI, workspace, DOC)

    sig_info = signature.pylsp_signature_help(doc._config, doc, sig_position)

    sigs = sig_info["signatures"]
    assert len(sigs) == 1
    assert sigs[0]["label"] == "main(param1, param2)"
    assert sigs[0]["parameters"][0]["label"] == "param1"
    assert sigs[0]["parameters"][0]["documentation"] == {
        "kind": "markdown",
        "value": "Docs for param1",
    }

    assert sig_info["activeParameter"] == 0


def test_multi_line_signature(workspace) -> None:
    # Over '( ' in main(
    sig_position = {"line": 17, "character": 5}
    doc = Document(DOC_URI, workspace, MULTI_LINE_DOC)

    sig_info = signature.pylsp_signature_help(doc._config, doc, sig_position)

    sigs = sig_info["signatures"]
    assert len(sigs) == 1
    assert sigs[0]["label"] == (
        "main(param1=None, param2=None, param3=None, param4=None, "
        "param5=None, param6=None, param7=None, param8=None)"
    )
    assert sigs[0]["parameters"][0]["label"] == "param1"
    assert sigs[0]["parameters"][0]["documentation"] == {
        "kind": "markdown",
        "value": "Docs for param1",
    }

    assert sig_info["activeParameter"] == 0


@pytest.mark.parametrize(
    "regex,doc",
    [
        (signature.SPHINX, "    :param test: parameter docstring"),
        (signature.EPYDOC, "    @param test: parameter docstring"),
        (signature.GOOGLE, "    test (str): parameter docstring"),
    ],
)
def test_docstring_params(regex, doc) -> None:
    m = regex.match(doc)
    assert m.group("param") == "test"
    assert m.group("doc") == "parameter docstring"