summaryrefslogtreecommitdiff
path: root/pylint/test/unittest_checker_typecheck.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/test/unittest_checker_typecheck.py')
-rw-r--r--pylint/test/unittest_checker_typecheck.py144
1 files changed, 144 insertions, 0 deletions
diff --git a/pylint/test/unittest_checker_typecheck.py b/pylint/test/unittest_checker_typecheck.py
index b7135ea..a2f3598 100644
--- a/pylint/test/unittest_checker_typecheck.py
+++ b/pylint/test/unittest_checker_typecheck.py
@@ -1,10 +1,19 @@
"""Unittest for the type checker."""
import unittest
+import sys
from astroid import test_utils
from pylint.checkers import typecheck
from pylint.testutils import CheckerTestCase, Message, set_config
+
+def python33_and_newer(test):
+ """
+ Decorator for any tests that will fail if launched not with Python 3.3+.
+ """
+ return unittest.skipIf(sys.version_info < (3, 3),
+ 'Python 3.2 and older')(test)
+
class TypeCheckerTest(CheckerTestCase):
"Tests for pylint.checkers.typecheck"
CHECKER_CLASS = typecheck.TypeChecker
@@ -88,6 +97,141 @@ class TypeCheckerTest(CheckerTestCase):
with self.assertNoMessages():
self.checker.visit_attribute(node)
+class IterableTest(CheckerTestCase):
+ CHECKER_CLASS = typecheck.IterableChecker
+
+ def test_non_iterable_in_for(self):
+ node = test_utils.extract_node("""
+ for i in 42:
+ print(i)
+ """)
+ message = Message('not-an-iterable', node=node, args='42')
+ with self.assertAddsMessages(message):
+ self.checker.visit_for(node)
+
+ node = test_utils.extract_node("""
+ for i in [1,2,3]:
+ print(i)
+ """)
+ with self.assertNoMessages():
+ self.checker.visit_for(node)
+
+ node = test_utils.extract_node("""
+ def count():
+ i = 0
+ while True:
+ yield i
+ i += 1
+
+ for i in count():
+ print(i)
+ """)
+ with self.assertNoMessages():
+ self.walk(node.root())
+
+ node = test_utils.extract_node("""
+ for i in "aeiou":
+ print(i)
+ """)
+ with self.assertNoMessages():
+ self.checker.visit_for(node)
+
+ @python33_and_newer
+ def test_non_iterable_in_yield_from(self):
+ node = test_utils.extract_node("""
+ yield from 42
+ """)
+ message = Message('not-an-iterable', node=node, args='42')
+ with self.assertAddsMessages(message):
+ self.checker.visit_yieldfrom(node)
+
+ node = test_utils.extract_node("""
+ yield from [1,2,3]
+ """)
+ with self.assertNoMessages():
+ self.checker.visit_yieldfrom(node)
+
+ def test_non_iterable_in_funcall_starargs(self):
+ node = test_utils.extract_node("""
+ foo(*123)
+ """)
+ message = Message('not-an-iterable', node=node, args='123')
+ with self.assertAddsMessages(message):
+ self.checker.visit_call(node)
+
+ node = test_utils.extract_node("""
+ stuff = [1,2,3]
+ foo(*stuff)
+ """)
+ with self.assertNoMessages():
+ self.walk(node.root())
+
+ def test_non_mapping_in_funcall_kwargs(self):
+ node = test_utils.extract_node("""
+ foo(**123)
+ """)
+ message = Message('not-a-mapping', node=node, args='123')
+ with self.assertAddsMessages(message):
+ self.checker.visit_call(node)
+
+ node = test_utils.extract_node("""
+ foo(**retdict())
+ """)
+ with self.assertNoMessages():
+ self.walk(node.root())
+
+ def test_non_iterable_in_listcomp(self):
+ node = test_utils.extract_node("""
+ [x ** 2 for x in 10]
+ """)
+ message = Message('not-an-iterable', node=node, args='10')
+ with self.assertAddsMessages(message):
+ self.checker.visit_listcomp(node)
+
+ node = test_utils.extract_node("""
+ [x ** 2 for x in range(10)]
+ """)
+ with self.assertNoMessages():
+ self.checker.visit_listcomp(node)
+
+ def test_non_iterable_in_dictcomp(self):
+ node = test_utils.extract_node("""
+ {x: chr(x) for x in 256}
+ """)
+ message = Message('not-an-iterable', node=node, args='256')
+ with self.assertAddsMessages(message):
+ self.checker.visit_dictcomp(node)
+
+ node = test_utils.extract_node("""
+ {ord(x): x for x in "aoeui"}
+ """)
+ with self.assertNoMessages():
+ self.checker.visit_dictcomp(node)
+
+ def test_non_iterable_in_setcomp(self):
+ node = test_utils.extract_node("""
+ {2 ** x for x in 10}
+ """)
+ message = Message('not-an-iterable', node=node, args='10')
+ with self.assertAddsMessages(message):
+ self.checker.visit_setcomp(node)
+
+ node = test_utils.extract_node("""
+ {2 ** x for x in range(10)}
+ """)
+ with self.assertNoMessages():
+ self.checker.visit_setcomp(node)
+
+ def test_non_iterable_in_generator(self):
+ node = test_utils.extract_node("__(x for x in 123)")
+ message = Message('not-an-iterable', node=node, args='123')
+ with self.assertAddsMessages(message):
+ self.walk(node.root())
+
+ node = test_utils.extract_node("__(chr(x) for x in range(25))")
+ with self.assertNoMessages():
+ self.walk(node.root())
+
if __name__ == '__main__':
unittest.main()