def test_insert_in_the_middle(self):
        linked = SinglyLinkedList(100)
        linked.append(200)
        linked.append(300)
        linked.insert(1000, 1)

        self.assertEqual(linked.as_list(), [100, 1000, 200, 300])
    def test_remove(self):
        linked = SinglyLinkedList(100)
        linked.append(200)
        linked.append(300)
        linked.remove(1)

        self.assertEqual(linked.as_list(), [100, 300])
    def test_as_list(self):
        linked = SinglyLinkedList()
        linked.append(100)
        linked.append(200)
        linked.append(300)

        self.assertEqual(linked.as_list(), [100, 200, 300])
    def test_append_multiple_with_initial_value(self):
        linked = SinglyLinkedList(1000)
        linked.append(100)
        linked.append(200)
        linked.append(300)

        self.assertEqual(linked.as_list(), [1000, 100, 200, 300])
    def test_remove_at_the_beginning_with_multiple_values(self):
        linked = SinglyLinkedList(100)
        linked.append(200)
        linked.append(300)
        linked.append(400)
        linked.remove(0)

        self.assertEqual(linked.as_list(), [200, 300, 400])
    def test_item_setting_by_index_overrides_previous_value_at_the_end(self):
        linked = SinglyLinkedList()
        linked.append(100)
        linked.append(200)
        linked.append(300)
        linked[2] = 400

        self.assertEqual(linked.as_list(), [100, 200, 400])
    def test_remove_at_the_end(self):
        linked = SinglyLinkedList(100)
        linked.append(200)
        linked.append(300)
        linked.append(400)
        linked.append(500)
        linked.remove(4)

        self.assertEqual(linked.as_list(), [100, 200, 300, 400])
class SinglyLinkedListQueue:
    def __init__(self, max_length):
        self._queue = SinglyLinkedList()
        self._length = 0
        self._max_length = max_length

    def enqueue(self, value):
        if self._length == self._max_length:
            raise ValueError("Overflow")
        self._length += 1
        self._queue.append(value)

    def dequeue(self):
        if self._length == 0:
            raise ValueError("Underflow")
        self._length -= 1
        return self._queue.remove(0).value

    def increase_max_length(self):
        self._max_length += 1

    def as_list(self):
        return self._queue.as_list()
    def test_remove_at_the_beginning(self):
        linked = SinglyLinkedList(100)
        linked.remove(0)

        self.assertEqual(linked.as_list(), [])
    def test_insert_at_the_beginning_without_initial_value(self):
        linked = SinglyLinkedList()
        linked.insert(1000, 0)

        self.assertEqual(linked.as_list(), [1000])
    def test_as_list_no_data(self):
        linked = SinglyLinkedList()

        self.assertEqual(linked.as_list(), [])
    def test_item_setting_by_index_with_a_previous_value(self):
        linked = SinglyLinkedList()
        linked.append(100)
        linked[1] = 200

        self.assertEqual(linked.as_list(), [100, 200])
    def test_item_setting_by_index(self):
        linked = SinglyLinkedList()
        linked[0] = 100

        self.assertEqual(linked.as_list(), [100])
    def test_prepend_adds_an_element_at_the_beginning_even_without_a_first_node(
            self):
        linked = SinglyLinkedList()
        linked.prepend(1000)

        self.assertEqual(linked.as_list(), [1000])
    def test_prepend_adds_an_element_at_the_beginning(self):
        linked = SinglyLinkedList(100)
        linked.prepend(1000)

        self.assertEqual(linked.as_list(), [1000, 100])
    def test_append_single(self):
        linked = SinglyLinkedList()
        linked.append(100)

        self.assertEqual(linked.as_list(), [100])