def test_insert_last(self):
     """
     Tests adding a node to the end of a list
     """
     l = LinkedList()
     l.insert_first("a")
     l.insert_last("b")
     self.assertEqual(l.size(), 2)
     self.assertEqual(l.get_last().data, "b")
 def test_insert_at_out_of_bounds(self):
     """
     Tests that node is inserted at the end of a list when index is out of bounds
     """
     l = LinkedList()
     l.insert_last("a")
     l.insert_last("b")
     l.insert_at("hi", 30)
     self.assertEqual(l.get_at(0).data, "a")
     self.assertEqual(l.get_at(1).data, "b")
     self.assertEqual(l.get_at(2).data, "hi")
 def test_insert_at_last_index(self):
     """
     Tests for insertion of node at the end of a list
     """
     l = LinkedList()
     l.insert_last("a")
     l.insert_last("b")
     l.insert_at("hi", 2)
     self.assertEqual(l.get_at(0).data, "a")
     self.assertEqual(l.get_at(1).data, "b")
     self.assertEqual(l.get_at(2).data, "hi")
 def test_remove_at_given_index(self):
     """
     Tests for removal of node at given index
     """
     l = LinkedList()
     l.insert_last(1)
     l.insert_last(2)
     l.insert_last(3)
     l.insert_last(4)
     self.assertEqual(l.get_at(1).data, 2)
     l.remove_at(1)
     self.assertEqual(l.get_at(1).data, 3)
 def test_remove_at_first_node(self):
     """
     Tests removal of first node
     """
     l = LinkedList()
     l.insert_last(1)
     l.insert_last(2)
     l.insert_last(3)
     l.insert_last(4)
     self.assertEqual(l.get_at(0).data, 1)
     l.remove_at(0)
     self.assertEqual(l.get_at(0).data, 2)
 def test_get_at(self):
     """
     Tests the return of a node from a given index
     """
     l = LinkedList()
     l.insert_last(1)
     l.insert_last(2)
     l.insert_last(3)
     l.insert_last(4)
     self.assertEqual(l.get_at(0).data, 1)
     self.assertEqual(l.get_at(1).data, 2)
     self.assertEqual(l.get_at(2).data, 3)
     self.assertEqual(l.get_at(3).data, 4)
 def test_insert_at_0_non_empty_list(self):
     """
     Tests for insertion of node at index 0 on non-empty list
     """
     l = LinkedList()
     l.insert_last("a")
     l.insert_last("b")
     l.insert_last("c")
     l.insert_at("hi", 0)
     self.assertEqual(l.get_at(0).data, "hi")
     self.assertEqual(l.get_at(1).data, "a")
     self.assertEqual(l.get_at(2).data, "b")
     self.assertEqual(l.get_at(3).data, "c")
 def test_insert_at_middle_index(self):
     """
     Test for insertion of node at index in the middle of a list
     """
     l = LinkedList()
     l.insert_last("a")
     l.insert_last("b")
     l.insert_last("c")
     l.insert_last("d")
     l.insert_at("hi", 2)
     self.assertEqual(l.get_at(0).data, "a")
     self.assertEqual(l.get_at(1).data, "b")
     self.assertEqual(l.get_at(2).data, "hi")
     self.assertEqual(l.get_at(3).data, "c")
     self.assertEqual(l.get_at(4).data, "d")
    def test_for_in_loop_on_linked_list(self):
        """
        Tests that a for of loop will work on a linked list
        """
        l = LinkedList()
        l.insert_last(1)
        l.insert_last(2)
        l.insert_last(3)
        l.insert_last(4)

        for node in l:
            node.data += 10

        self.assertEqual(l.get_at(0).data, 11)
        self.assertEqual(l.get_at(1).data, 12)
        self.assertEqual(l.get_at(2).data, 13)
        self.assertEqual(l.get_at(3).data, 14)
    def test_for_each(self):
        """
        Test that a transform runs on each node 
        """
        def fn(node):
            node.data += 10

        l = LinkedList()
        l.insert_last(1)
        l.insert_last(2)
        l.insert_last(3)
        l.insert_last(4)
        l.for_each(fn)
        self.assertEqual(l.get_at(0).data, 11)
        self.assertEqual(l.get_at(1).data, 12)
        self.assertEqual(l.get_at(2).data, 13)
        self.assertEqual(l.get_at(3).data, 14)