sphinx/tests/test_pycode/test_pycode_ast.py
2024-11-22 21:54:26 +00:00

74 lines
3.4 KiB
Python

"""Test pycode.ast"""
from __future__ import annotations
import ast
import pytest
from sphinx.pycode.ast import unparse as ast_unparse
@pytest.mark.parametrize(
('source', 'expected'),
[
('a + b', 'a + b'), # Add
('a and b', 'a and b'), # And
('os.path', 'os.path'), # Attribute
('1 * 2', '1 * 2'), # BinOp
('a & b', 'a & b'), # BitAnd
('a | b', 'a | b'), # BitOr
('a ^ b', 'a ^ b'), # BitXor
('a and b and c', 'a and b and c'), # BoolOp
("b'bytes'", "b'bytes'"), # Bytes
('object()', 'object()'), # Call
('1234', '1234'), # Constant, Num
("{'key1': 'value1', 'key2': 'value2'}",
"{'key1': 'value1', 'key2': 'value2'}"), # Dict
('a / b', 'a / b'), # Div
('...', '...'), # Ellipsis
('a // b', 'a // b'), # FloorDiv
('Tuple[int, int]', 'Tuple[int, int]'), # Index, Subscript
('~1', '~1'), # Invert
('lambda x, y: x + y',
'lambda x, y: ...'), # Lambda
('[1, 2, 3]', '[1, 2, 3]'), # List
('a << b', 'a << b'), # LShift
('a @ b', 'a @ b'), # MatMult
('a % b', 'a % b'), # Mod
('a * b', 'a * b'), # Mult
('sys', 'sys'), # Name, NameConstant
('not a', 'not a'), # Not
('a or b', 'a or b'), # Or
('a**b', 'a**b'), # Pow
('a >> b', 'a >> b'), # RShift
('{1, 2, 3}', '{1, 2, 3}'), # Set
('a - b', 'a - b'), # Sub
("'str'", "'str'"), # Str
('+a', '+a'), # UAdd
('-1', '-1'), # UnaryOp
('-a', '-a'), # USub
('(1, 2, 3)', '(1, 2, 3)'), # Tuple
('()', '()'), # Tuple (empty)
('(1,)', '(1,)'), # Tuple (single item)
('lambda x=0, /, y=1, *args, z, **kwargs: x + y + z',
'lambda x=0, /, y=1, *args, z, **kwargs: ...'), # posonlyargs
('0x1234', '0x1234'), # Constant
('1_000_000', '1_000_000'), # Constant
('Tuple[:,:]', 'Tuple[:, :]'), # Index, Subscript, 2x Slice
('Tuple[1:2]', 'Tuple[1:2]'), # Index, Subscript, Slice(no-step)
('Tuple[1:2:3]', 'Tuple[1:2:3]'), # Index, Subscript, Slice
('x[:, np.newaxis, :, :]',
'x[:, np.newaxis, :, :]'), # Index, Subscript, numpy extended syntax
('y[:, 1:3][np.array([0, 2, 4]), :]',
'y[:, 1:3][np.array([0, 2, 4]), :]'), # Index, 2x Subscript, numpy extended syntax
],
) # fmt: skip
def test_unparse(source, expected):
module = ast.parse(source)
assert ast_unparse(module.body[0].value, source) == expected
def test_unparse_None():
assert ast_unparse(None) is None