import unittest
import path
import sys
from cStringIO import StringIO

from pynto import util

class TestItem:
    def __init__ (self, value):
        self.value = value
        return

    def __str__ (self):
        return "(%d)" % self.value

    pass

class TestLinkList (unittest.TestCase):
    
    def testAddition (self):
        llist = util.LinkList ('prev', 'next')
        llist.append (TestItem (1))
        llist.append (TestItem (2))
        llist.append (TestItem (3))
        idx = 1
        for item in llist:
            self.assertEqual (idx, item.value)
            idx += 1
            pass
        return

    def testInsertion (self):
        llist = util.LinkList ('prev', 'next')
        llist.insert (TestItem (1))
        llist.insert (TestItem (2))
        llist.insert (TestItem (3))
        idx = 3
        for item in llist:
            self.assertEqual (idx, item.value)
            idx -= 1
            pass
        return

    def testFunky (self):
        llist = util.LinkList ('prev', 'next')
        items = map (TestItem, range (0,10))

        llist.append (items[0])
        llist.append (items[1])
        llist.append (items[2])
        llist.remove (items[1])
        llist.append (items[3])
        llist.insert (items[6])
        llist.insert (items[5])
        llist.insert (items[4])
        llist.remove (items[5])
        llist.insert (items[9])

        expected = [ 9, 4, 6, 0, 2, 3 ]
        for item in llist:
            self.assertEqual (expected[0], item.value)
            expected = expected[1:]
            pass
        return

    def testIterationAndDeletion (self):
        llist = util.LinkList ('prev', 'next')
        llist.append (TestItem (1))
        llist.append (TestItem (2))
        llist.append (TestItem (3))
        idx = 1
        for item in llist:
            self.assertEqual (idx, item.value)
            idx += 1
            llist.remove (item)
            pass
        self.assertEqual (idx, 4)
        return

def add_tests (suite):
    for testname in dir (TestLinkList):
        if testname.startswith ('test'):
            suite.addTest (TestLinkList(testname))
            pass
        pass
    return

if __name__ == "__main__":
    unittest.main ()
