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()

Copyleft 2006 Juanjo Conti