summaryrefslogtreecommitdiff
path: root/pylint/test/unittest_checker_base.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/test/unittest_checker_base.py')
-rw-r--r--pylint/test/unittest_checker_base.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/pylint/test/unittest_checker_base.py b/pylint/test/unittest_checker_base.py
index c68f379..fb595e3 100644
--- a/pylint/test/unittest_checker_base.py
+++ b/pylint/test/unittest_checker_base.py
@@ -10,6 +10,13 @@ from pylint.checkers import base
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 DocstringTest(CheckerTestCase):
CHECKER_CLASS = base.DocStringChecker
@@ -293,5 +300,105 @@ class ComparisonTest(CheckerTestCase):
self.checker.visit_compare(node)
+class IterableTest(CheckerTestCase):
+ CHECKER_CLASS = base.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_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_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("""
+ args = [1, 2, 3]
+ foo(**args)
+ """)
+ message = Message('not-a-mapping', node=node, args='[1, 2, 3]')
+ with self.assertAddsMessages(message):
+ self.walk(node.root())
+
+ node = test_utils.extract_node("""
+ kwargs = {'answer': 42}
+ foo(**kwargs)
+ """)
+ with self.assertNoMessages():
+ self.walk(node.root())
+
+ node = test_utils.extract_node("""
+ foo(**dict(a=1, b=2))
+ """)
+ with self.assertNoMessages():
+ self.checker.visit_call(node)
+
+
+
if __name__ == '__main__':
unittest.main()