implemented iterator design pattern

This commit is contained in:
tylerlaberge
2016-08-06 15:38:31 -04:00
parent 11f63418df
commit 87bcb4b270
2 changed files with 142 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
from abc import ABCMeta, abstractmethod
class Iterator(object):
"""
An Iterator class for the Iterator design pattern.
"""
def __init__(self, iterable):
"""
Initialize a new Iterator instance.
@param iterable: An Iterable object to iterate over.
@type iterable: Iterable
"""
self.iterable = iterable
def __iter__(self):
return self
def __next__(self):
return self.iterable.__next__()
class Iterable(object, metaclass=ABCMeta):
"""
An abstract class representing an Iterable object as part of the Iterator design pattern.
"""
@abstractmethod
def __next__(self):
"""
All Iterable's must implement a __next__ method which eventually raises StopIteration.
"""
pass

View File

@@ -0,0 +1,109 @@
from unittest import TestCase
from pypatterns.behavioral.iterator import Iterable, Iterator
class IterableTestCase(TestCase):
"""
Unit testing class for the Iterable class.
"""
def setUp(self):
"""
Initialize testing data.
"""
class Counter(Iterable):
def __init__(self, max):
self.count = 0
self.max = max
def __next__(self):
self.count += 1
if self.count > self.max:
raise StopIteration
else:
return self.count - 1
self.counter_class = Counter
def test_next(self):
"""
Test the iterables next method.
@raise AssertionError: If the test fails.
"""
counter = self.counter_class(10)
for i in range(10):
self.assertEquals(i, counter.__next__())
def test_stop_iteration(self):
"""
Test that StopIteration is raised.
@raise AssertionError: If the test fails.
"""
counter = self.counter_class(0)
with self.assertRaises(StopIteration):
counter.__next__()
class IteratorTestCase(TestCase):
"""
Unit testing class for the Iterator class.
"""
def setUp(self):
"""
Initialize testing data.
"""
class Counter(Iterable):
def __init__(self, max):
self.count = 0
self.max = max
def __next__(self):
self.count += 1
if self.count > self.max:
raise StopIteration
else:
return self.count - 1
class CounterIterator(Iterator):
def __init__(self):
super().__init__(Counter(10))
self.counter_iterator_class = CounterIterator
def test_next(self):
"""
Test the built in next method on the Iterator.
@raise AssertionError: If the test fails.
"""
counter_iterator = self.counter_iterator_class()
for i in range(10):
self.assertEquals(i, next(counter_iterator))
def test_stop_iteration(self):
"""
Test that stop iteration is raised.
@raise AssertionError: If the test fails.
"""
counter_iterator = self.counter_iterator_class()
with self.assertRaises(StopIteration):
for i in range(12):
next(counter_iterator)
def test_loop(self):
"""
Test looping over an Iterator class.
@raise AssertionError: If the test fails.
"""
counter_iterator = self.counter_iterator_class()
i = 0
for count in counter_iterator:
self.assertEquals(i, count)
i += 1