download: circular-r3Tested.py
class Circular(list):
def __init__(self, sequence):
list.__init__(self, sequence)
self.i = 0
def _not_in_range(self, i):
return i < 0 or i >= len(self)
def set_index(self, i):
if self._not_in_range(i):
raise IndexError, 'Can\'t set index out of range'
else:
self.i = i
def get_index(self):
if self._not_in_range(self.i):
self.i = len(self) - 1
return self.i
def next(self, n=1):
if self == []:
raise Exception, 'There are no items'
if self._not_in_range(self.i):
self.i = len(self) - 1
self.i = (self.i + n) % len(self)
return self[self.i]
def prev(self, n=1):
return self.next(-n)
if __name__ == '__main__':
'''Clase testeada con unittest'''
import unittest
class Prueba(unittest.TestCase):
def setUp(self):
self.l = Circular([1, 2, 3, 15, "www", 'u'])
def testArrancaDeCero(self):
self.assertEqual(self.l.next(), 2)
def testTomaElPasoComoParametroOpcional(self):
self.assertEqual(self.l.next(4), "www")
def testTomaPasoNegativo(self):
self.assertEqual(self.l.next(-2), "www")
def testTomaPasoQueDaUnParDeVueltas(self):
self.assertEqual(self.l.next(8), 3)
def testSePortaIgualParaAtrasYParaAdelante(self):
self.assertEqual(self.l.prev(), "u")
def testIndiceFueraDeRango(self):
self.assertRaises(IndexError, self.l.set_index, 8)
def testNoItems(self):
self.assertRaises(Exception, Circular([]).next)
def testResizeList(self):
'''el indice queda fuera de rango'''
self.l.set_index(5)
self.l.pop()
self.assertEqual(self.l.prev(), 15)
unittest.main()