diff options
Diffstat (limited to 'pylint/test/unittest_checker_typecheck.py')
-rw-r--r-- | pylint/test/unittest_checker_typecheck.py | 144 |
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() |