summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorcpopa <devnull@localhost>2014-08-20 17:12:32 +0300
committercpopa <devnull@localhost>2014-08-20 17:12:32 +0300
commit2cf28a85a6a98789ef234639784663ed69a8436b (patch)
tree75ad0dff41cdb6d805fa8afb393c76848dbfd46b /test
parent9e32666ed753db8307fdbd0ed39d395b213a34ef (diff)
downloadastroid-2cf28a85a6a98789ef234639784663ed69a8436b.tar.gz
Fix an infinite loop in the inference, by returning a copy of instance attributes, when calling 'instance_attr'. Closes issue #34 (patch by Emile Anclin).
Diffstat (limited to 'test')
-rw-r--r--test/unittest_inference.py29
1 files changed, 29 insertions, 0 deletions
diff --git a/test/unittest_inference.py b/test/unittest_inference.py
index ea49e50..e525a9c 100644
--- a/test/unittest_inference.py
+++ b/test/unittest_inference.py
@@ -930,6 +930,35 @@ def f(x):
self.assertEqual(len(infered), 1)
self.assertEqual(infered[0], YES)
+ def test_nonregr_instance_attrs(self):
+ """non regression for instance_attrs infinite loop : pylint / #4"""
+
+ code = """
+class Foo(object):
+
+ def set_42(self):
+ self.attr = 42
+
+class Bar(Foo):
+
+ def __init__(self):
+ self.attr = 41
+ """
+ astroid = builder.string_build(code, __name__, __file__)
+ foo_class = astroid['Foo']
+ bar_class = astroid['Bar']
+ bar_self = astroid['Bar']['__init__']['self']
+ assattr = bar_class.instance_attrs['attr'][0]
+ self.assertEqual(len(foo_class.instance_attrs['attr']), 1)
+ self.assertEqual(len(bar_class.instance_attrs['attr']), 1)
+ self.assertEqual(bar_class.instance_attrs, {'attr': [assattr]})
+ # call 'instance_attr' via 'Instance.getattr' to trigger the bug:
+ instance = bar_self.infered()[0]
+ _attr = instance.getattr('attr')
+ self.assertEqual(len(bar_class.instance_attrs['attr']), 1)
+ self.assertEqual(len(foo_class.instance_attrs['attr']), 1)
+ self.assertEqual(bar_class.instance_attrs, {'attr': [assattr]})
+
def test_python25_generator_exit(self):
sys.stderr = StringIO()
data = "b = {}[str(0)+''].a"