File: test_functions.py

package info (click to toggle)
python-griffe 1.7.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,092 kB
  • sloc: python: 14,305; javascript: 84; makefile: 41; sh: 23
file content (142 lines) | stat: -rw-r--r-- 5,422 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
"""Test functions loading."""

from __future__ import annotations

import pytest

from griffe import ParameterKind, temporary_visited_module


def test_visit_simple_function() -> None:
    """Test functions parameters loading."""
    with temporary_visited_module("def f(foo='<>'): ...") as module:
        function = module["f"]
        assert len(function.parameters) == 1
        param = function.parameters[0]
        assert param is function.parameters["foo"]
        assert param.name == "foo"
        assert param.kind is ParameterKind.positional_or_keyword
        assert param.default == "'<>'"


def test_visit_function_positional_only_param() -> None:
    """Test functions parameters loading."""
    with temporary_visited_module("def f(posonly, /): ...") as module:
        function = module["f"]
        assert len(function.parameters) == 1
        param = function.parameters[0]
        assert param is function.parameters["posonly"]
        assert param.name == "posonly"
        assert param.kind is ParameterKind.positional_only
        assert param.default is None


def test_visit_function_positional_only_param_with_default() -> None:
    """Test functions parameters loading."""
    with temporary_visited_module("def f(posonly=0, /): ...") as module:
        function = module["f"]
        assert len(function.parameters) == 1
        param = function.parameters[0]
        assert param is function.parameters["posonly"]
        assert param.name == "posonly"
        assert param.kind is ParameterKind.positional_only
        assert param.default == "0"


def test_visit_function_positional_or_keyword_param() -> None:
    """Test functions parameters loading."""
    with temporary_visited_module("def f(posonly, /, poskw): ...") as module:
        function = module["f"]
        assert len(function.parameters) == 2
        param = function.parameters[1]
        assert param is function.parameters["poskw"]
        assert param.name == "poskw"
        assert param.kind is ParameterKind.positional_or_keyword
        assert param.default is None


def test_visit_function_positional_or_keyword_param_with_default() -> None:
    """Test functions parameters loading."""
    with temporary_visited_module("def f(posonly, /, poskw=0): ...") as module:
        function = module["f"]
        assert len(function.parameters) == 2
        param = function.parameters[1]
        assert param is function.parameters["poskw"]
        assert param.name == "poskw"
        assert param.kind is ParameterKind.positional_or_keyword
        assert param.default == "0"


def test_visit_function_keyword_only_param() -> None:
    """Test functions parameters loading."""
    with temporary_visited_module("def f(*, kwonly): ...") as module:
        function = module["f"]
        assert len(function.parameters) == 1
        param = function.parameters[0]
        assert param is function.parameters["kwonly"]
        assert param.name == "kwonly"
        assert param.kind is ParameterKind.keyword_only
        assert param.default is None


def test_visit_function_keyword_only_param_with_default() -> None:
    """Test functions parameters loading."""
    with temporary_visited_module("def f(*, kwonly=0): ...") as module:
        function = module["f"]
        assert len(function.parameters) == 1
        param = function.parameters[0]
        assert param is function.parameters["kwonly"]
        assert param.name == "kwonly"
        assert param.kind is ParameterKind.keyword_only
        assert param.default == "0"


def test_visit_function_syntax_error() -> None:
    """Test functions parameters loading."""
    with pytest.raises(SyntaxError), temporary_visited_module("def f(/, poskw=0): ..."):
        ...


def test_visit_function_variadic_params() -> None:
    """Test functions variadic parameters visit."""
    with temporary_visited_module("def f(*args: str, kw=1, **kwargs: int): ...") as module:
        function = module["f"]
        assert len(function.parameters) == 3
        param = function.parameters[0]
        assert param.name == "args"
        assert param.annotation.name == "str"
        assert param.annotation.canonical_path == "str"
        param = function.parameters[1]
        assert param.annotation is None
        param = function.parameters[2]
        assert param.name == "kwargs"
        assert param.annotation.name == "int"
        assert param.annotation.canonical_path == "int"


def test_visit_function_params_annotations() -> None:
    """Test functions parameters loading."""
    with temporary_visited_module(
        """
        import typing
        from typing import Any
        def f_annorations(
            a: str,
            b: Any,
            c: typing.Optional[typing.List[int]],
            d: float | None):
            ...
        """,
    ) as module:
        function = module["f_annorations"]
        assert len(function.parameters) == 4
        param = function.parameters[0]
        assert param.annotation.name == "str"
        assert param.annotation.canonical_path == "str"
        param = function.parameters[1]
        assert param.annotation.name == "Any"
        assert param.annotation.canonical_path == "typing.Any"
        param = function.parameters[2]
        assert str(param.annotation) == "typing.Optional[typing.List[int]]"
        param = function.parameters[3]
        assert str(param.annotation) == "float | None"