Skip to content

Commit

Permalink
Add tests of failing behaviour of some @Property inference
Browse files Browse the repository at this point in the history
Ref pylint-dev#940. Would cause `Enum.__members__` to fail for enum classes
defined as subclasses of `enum.Enum`
  • Loading branch information
nelfin committed Apr 11, 2021
1 parent f2b197a commit 0654bb4
Showing 1 changed file with 89 additions and 0 deletions.
89 changes: 89 additions & 0 deletions tests/unittest_scoped_nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -1923,6 +1923,95 @@ def update(self):
builder.parse(data)


def test_issue940_metaclass_subclass_property():
node = builder.extract_node(
"""
class BaseMeta(type):
@property
def __members__(cls):
return ['a', 'property']
class Parent(metaclass=BaseMeta):
pass
class Derived(Parent):
pass
Derived.__members__
"""
)
inferred = next(node.infer())
assert isinstance(inferred, nodes.List)
assert [c.value for c in inferred.elts] == ['a', 'property']


def test_issue940_property_grandchild():
node = builder.extract_node(
"""
class Grandparent:
@property
def __members__(self):
return ['a', 'property']
class Parent(Grandparent):
pass
class Child(Parent):
pass
Child().__members__
"""
)
inferred = next(node.infer())
assert isinstance(inferred, nodes.List)
assert [c.value for c in inferred.elts] == ['a', 'property']


def test_issue940_metaclass_property():
node = builder.extract_node(
"""
class BaseMeta(type):
@property
def __members__(cls):
return ['a', 'property']
class Parent(metaclass=BaseMeta):
pass
Parent.__members__
"""
)
inferred = next(node.infer())
assert isinstance(inferred, nodes.List)
assert [c.value for c in inferred.elts] == ['a', 'property']


def test_issue940_metaclass_values_funcdef():
node = builder.extract_node(
"""
class BaseMeta(type):
def __members__(cls):
return ['a', 'func']
class Parent(metaclass=BaseMeta):
pass
Parent.__members__()
"""
)
inferred = next(node.infer())
assert isinstance(inferred, nodes.List)
assert [c.value for c in inferred.elts] == ['a', 'func']


def test_issue940_metaclass_derived_funcdef():
node = builder.extract_node(
"""
class BaseMeta(type):
def __members__(cls):
return ['a', 'func']
class Parent(metaclass=BaseMeta):
pass
class Derived(Parent):
pass
Derived.__members__()
"""
)
inferred_result = next(node.infer())
assert isinstance(inferred_result, nodes.List)
assert [c.value for c in inferred_result.elts] == ['a', 'func']


def test_metaclass_cannot_infer_call_yields_an_instance():
node = builder.extract_node(
"""
Expand Down

0 comments on commit 0654bb4

Please sign in to comment.