download: circular-r4Tested.py
class Circular(list):
    
    def __init__(self, sequence=[]):
        super(Circular, self).__init__(sequence)
        self.position = 0

    def is_valid_position(self, pos):
        return pos < 0 or pos >= len(self)
            
    def set_position(self, pos):
        if self.is_valid_position(pos):
	    raise IndexError, 'Can\'t set index out of range'
	else:
	    self.position = pos

    def get_position(self):
        if self.is_valid_position(self.position):
            self.position = len(self) - 1
        return self.position

    def current(self):
        return self[self.get_position()]
            
    def next(self, n=1):
        if not self:
	    raise Exception, 'There are no items'
        if self.is_valid_position(self.position):
	    self.position = len(self) - 1
        self.position = (self.position + n) % len(self)
        return self[self.position]
        
    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.current(), 1)
        def testTomaElPasoComoParametroOpcional(self):
            self.assertEqual(self.l.next(4), "www")
            self.assertEqual(self.l.next(), 'u')
        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')
            self.assertEqual(self.l.prev(-6), 'u')
        def testSetearPosicion(self):
            self.l.set_position(3)
            self.assertEqual(self.l.current(), 15)
        def testIndiceFueraDeRango(self):
            '''no se puede setear una posicion fuera de rango'''
            self.assertRaises(IndexError, self.l.set_position, 8)
        def testNoItems(self):
            self.assertRaises(Exception, Circular([]).next)
        def testResizeList(self):
            '''la posicion queda fuera de rango'''
            self.l.set_position(5)
            self.l.pop()
            self.assertEqual(self.l.prev(), 15)
        def testInstanciarSinParametros(self):
            self.assertEquals(Circular(), Circular([]))

    unittest.main()

Copyleft 2006 Juanjo Conti