class TestLinkedListCursorRemoveMethods(unittest.TestCase):


    def setUp(self):
        # empty list testing empty removals
        self.emptylinkedlist = LinkedListCursor()
        # populated list for testing populated removals
        self.poplinkedlist = LinkedListCursor(range(0, 10))


    def testRemoveItemAtHeadEmpty(self):
        self.assertRaises(IndexError, self.emptylinkedlist.removeItemAtHead)
        self.assertEqual(len(self.emptylinkedlist), 0)


    def testRemoveItemAtHeadPopulated(self):
        item = self.poplinkedlist.removeItemAtHead()
        self.assertEqual(item, 0)
        self.assertEqual(self.poplinkedlist.head.item, 1)
        self.assertEqual(len(self.poplinkedlist), 9)


    def testRemoveItemAtCursorEmpty(self):
        self.assertRaises(IndexError, self.emptylinkedlist.removeItemAtCursor)
        self.assertEqual(len(self.emptylinkedlist), 0)


    def testRemoveItemAtCursorPopulated(self):
        item = self.poplinkedlist.removeItemAtCursor()
        self.assertEqual(item, 1)
        self.assertEqual(self.poplinkedlist.cursor.item, 2)
        self.assertEqual(len(self.poplinkedlist), 9)
        # make sure if the cursor is at the tail it removes it
        # and sets it to the previous node
        self.poplinkedlist.cursor = self.poplinkedlist.tail
        item = self.poplinkedlist.removeItemAtCursor()
        self.assertEqual(item, 9)
        self.assertEqual(self.poplinkedlist.cursor.item, 8)
        self.assertEqual(len(self.poplinkedlist), 8)


    def testRemoveItemAtTailEmpty(self):
        self.assertRaises(IndexError, self.emptylinkedlist.removeItemAtTail)
        self.assertEqual(len(self.emptylinkedlist), 0)


    def testRemoveItemAtTailPopulated(self):
        item = self.poplinkedlist.removeItemAtTail()
        self.assertEqual(item, 9)
        self.assertEqual(self.poplinkedlist.tail.item, 8)
        self.assertEqual(len(self.poplinkedlist), 9)