aboutsummaryrefslogtreecommitdiff
path: root/tests/functional/n/non/non_iterator_returned.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/functional/n/non/non_iterator_returned.py')
-rw-r--r--tests/functional/n/non/non_iterator_returned.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/tests/functional/n/non/non_iterator_returned.py b/tests/functional/n/non/non_iterator_returned.py
new file mode 100644
index 000000000..4d0dd2a39
--- /dev/null
+++ b/tests/functional/n/non/non_iterator_returned.py
@@ -0,0 +1,101 @@
+"""Check non-iterators returned by __iter__ """
+
+# pylint: disable=too-few-public-methods, missing-docstring, no-self-use, useless-object-inheritance, consider-using-with
+
+
+class FirstGoodIterator(object):
+ """ yields in iterator. """
+
+ def __iter__(self):
+ for index in range(10):
+ yield index
+
+
+class SecondGoodIterator(object):
+ """ __iter__ and next """
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ """ Infinite iterator, but still an iterator """
+ return 1
+
+ def next(self):
+ """Same as __next__, but for Python 2."""
+ return 1
+
+
+class ThirdGoodIterator(object):
+ """ Returns other iterator, not the current instance """
+
+ def __iter__(self):
+ return SecondGoodIterator()
+
+
+class FourthGoodIterator(object):
+ """ __iter__ returns iter(...) """
+
+ def __iter__(self):
+ return iter(range(10))
+
+
+class IteratorMetaclass(type):
+ def __next__(cls):
+ return 1
+
+ def next(cls):
+ return 2
+
+
+class IteratorClass(object, metaclass=IteratorMetaclass):
+ """Iterable through the metaclass."""
+
+
+class FifthGoodIterator(object):
+ """__iter__ returns a class which uses an iterator-metaclass."""
+
+ def __iter__(self):
+ return IteratorClass
+
+
+class FileBasedIterator(object):
+ def __init__(self, path):
+ self.path = path
+ self.file = None
+
+ def __iter__(self):
+ if self.file is not None:
+ self.file.close()
+ self.file = open(self.path, encoding="utf-8")
+ # self file has two infered values: None and <instance of 'file'>
+ # we don't want to emit error in this case
+ return self.file
+
+
+class FirstBadIterator(object):
+ """ __iter__ returns a list """
+
+ def __iter__(self): # [non-iterator-returned]
+ return []
+
+
+class SecondBadIterator(object):
+ """ __iter__ without next """
+
+ def __iter__(self): # [non-iterator-returned]
+ return self
+
+
+class ThirdBadIterator(object):
+ """ __iter__ returns an instance of another non-iterator """
+
+ def __iter__(self): # [non-iterator-returned]
+ return SecondBadIterator()
+
+
+class FourthBadIterator(object):
+ """__iter__ returns a class."""
+
+ def __iter__(self): # [non-iterator-returned]
+ return ThirdBadIterator