blob: 6398f78ade4d0d721d98cf5b0330f601ae6d5e4c [file] [log] [blame]
# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE
# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt
import pytest
from astroid import extract_node
from astroid.const import PY312_PLUS
from astroid.nodes import (
AssignName,
ParamSpec,
Subscript,
TypeAlias,
TypeVar,
TypeVarTuple,
)
if not PY312_PLUS:
pytest.skip("Requires Python 3.12 or higher", allow_module_level=True)
def test_type_alias() -> None:
node = extract_node("type Point[T] = list[float, float]")
assert isinstance(node, TypeAlias)
assert isinstance(node.type_params[0], TypeVar)
assert isinstance(node.type_params[0].name, AssignName)
assert node.type_params[0].name.name == "T"
assert node.type_params[0].bound is None
assert isinstance(node.value, Subscript)
assert node.value.value.name == "list"
assert node.value.slice.name == "tuple"
assert all(elt.name == "float" for elt in node.value.slice.elts)
assert node.inferred()[0] is node
assert node.type_params[0].inferred()[0] is node.type_params[0]
assert node.statement() is node
assigned = next(node.assigned_stmts())
assert assigned is node.value
def test_type_param_spec() -> None:
node = extract_node("type Alias[**P] = Callable[P, int]")
params = node.type_params[0]
assert isinstance(params, ParamSpec)
assert isinstance(params.name, AssignName)
assert params.name.name == "P"
assert node.inferred()[0] is node
def test_type_var_tuple() -> None:
node = extract_node("type Alias[*Ts] = tuple[*Ts]")
params = node.type_params[0]
assert isinstance(params, TypeVarTuple)
assert isinstance(params.name, AssignName)
assert params.name.name == "Ts"
assert node.inferred()[0] is node
def test_type_param() -> None:
func_node = extract_node("def func[T]() -> T: ...")
assert isinstance(func_node.type_params[0], TypeVar)
assert func_node.type_params[0].name.name == "T"
assert func_node.type_params[0].bound is None
class_node = extract_node("class MyClass[T]: ...")
assert isinstance(class_node.type_params[0], TypeVar)
assert class_node.type_params[0].name.name == "T"
assert class_node.type_params[0].bound is None
def test_get_children() -> None:
func_node = extract_node("def func[T]() -> T: ...")
func_children = tuple(func_node.get_children())
assert isinstance(func_children[2], TypeVar)
class_node = extract_node("class MyClass[T]: ...")
class_children = tuple(class_node.get_children())
assert isinstance(class_children[0], TypeVar)