blob: 6e66c630f1b47dac623ef764616e9e032194deb6 [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
from importlib.util import find_spec
import pytest
from astroid import Uninferable, extract_node
from astroid.bases import UnboundMethod
from astroid.const import PY312_PLUS
from astroid.manager import AstroidManager
from astroid.nodes import FunctionDef
HAS_PYQT6 = find_spec("PyQt6")
@pytest.mark.skipif(HAS_PYQT6 is None, reason="These tests require the PyQt6 library.")
# TODO: enable for Python 3.12 as soon as PyQt6 release is compatible
@pytest.mark.skipif(PY312_PLUS, reason="This test was segfaulting with Python 3.12.")
class TestBrainQt:
AstroidManager.brain["extension_package_whitelist"] = {"PyQt6"} # noqa: RUF012
@staticmethod
def test_value_of_lambda_instance_attrs_is_list():
"""Regression test for https://github.com/pylint-dev/pylint/issues/6221.
A crash occurred in pylint when a nodes.FunctionDef was iterated directly,
giving items like "self" instead of iterating a one-element list containing
the wanted nodes.FunctionDef.
"""
src = """
from PyQt6 import QtPrintSupport as printsupport
printsupport.QPrintPreviewDialog.paintRequested #@
"""
node = extract_node(src)
attribute_node = node.inferred()[0]
if attribute_node is Uninferable:
pytest.skip("PyQt6 C bindings may not be installed?")
assert isinstance(attribute_node, UnboundMethod)
# scoped_nodes.Lambda.instance_attrs is typed as Dict[str, List[NodeNG]]
assert isinstance(attribute_node.instance_attrs["connect"][0], FunctionDef)
@staticmethod
def test_implicit_parameters() -> None:
"""Regression test for https://github.com/pylint-dev/pylint/issues/6464."""
src = """
from PyQt6.QtCore import QTimer
timer = QTimer()
timer.timeout.connect #@
"""
node = extract_node(src)
attribute_node = node.inferred()[0]
if attribute_node is Uninferable:
pytest.skip("PyQt6 C bindings may not be installed?")
assert isinstance(attribute_node, FunctionDef)
assert attribute_node.implicit_parameters() == 1
@staticmethod
def test_slot_disconnect_no_args() -> None:
"""Test calling .disconnect() on a signal.
See https://github.com/pylint-dev/astroid/pull/1531#issuecomment-1111963792
"""
src = """
from PyQt6.QtCore import QTimer
timer = QTimer()
timer.timeout.disconnect #@
"""
node = extract_node(src)
attribute_node = node.inferred()[0]
if attribute_node is Uninferable:
pytest.skip("PyQt6 C bindings may not be installed?")
assert isinstance(attribute_node, FunctionDef)
assert attribute_node.args.defaults