class TestLinkedListInsertMethods(unittest.TestCase):


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


    def testInsertAtHeadEmpty(self):
        self.emptylinkedlist.insertAtHead(1)
        self.assertEqual(self.emptylinkedlist.head.item, 1)
        self.assertEqual(len(self.emptylinkedlist), 1)


    def testInsertAtHeadPopulated(self):
        self.poplinkedlist.insertAtHead(-1)
        self.assertEqual(self.poplinkedlist.head.item, -1)
        self.assertEqual(self.poplinkedlist.head.link.item, 0)
        self.assertEqual(len(self.poplinkedlist), 11)


    def testInsertAfterCursorEmpty(self):
        self.assertRaises(IndexError, self.emptylinkedlist.insertAfterCursor, 0)
        self.assertEqual(len(self.emptylinkedlist), 0)


    def testInsertAfterCursorPopulated(self):
        self.poplinkedlist.insertAfterCursor(1.5)
        self.assertEqual(self.poplinkedlist.cursor.link.item, 1.5)
        self.assertEqual(len(self.poplinkedlist), 11)


    def testInsertBeforeCursorEmpty(self):
        self.assertRaises(IndexError, self.emptylinkedlist.insertBeforeCursor, 0)
        self.assertEqual(len(self.emptylinkedlist), 0)


    def testInsertBeforeCursorPopulated(self):
        self.poplinkedlist.insertBeforeCursor(.5)
        self.assertEqual(self.poplinkedlist.head.link.item, .5)
        self.assertEqual(len(self.poplinkedlist), 11)


    def testInsertAtTailEmpty(self):
        self.emptylinkedlist.insertAtTail(1)
        self.assertEqual(self.emptylinkedlist.head.item, 1)
        self.assertEqual(len(self.emptylinkedlist), 1)
        # test that it sets the cursor
        self.emptylinkedlist.insertAtTail(2)
        self.assertEqual(self.emptylinkedlist.cursor.item, 2)
        self.assertEqual(len(self.emptylinkedlist), 2)
        # then finally test it sets the tail
        self.emptylinkedlist.insertAtTail(3)
        self.assertEqual(self.emptylinkedlist.tail.item, 3)
        self.assertEqual(len(self.emptylinkedlist), 3)


    def testInsertAtTailPopulated(self):
        self.poplinkedlist.insertAtTail(10)
        self.assertEqual(self.poplinkedlist.tail.item, 10)
        self.assertEqual(len(self.poplinkedlist), 11)