def test():
    dll = List()
    dll.insert(len(dll), 83)
    dll.insert(len(dll), 82)
    dll.insert(len(dll), 81)
    dll.insert(len(dll), 80)
    return dll.end.prev.prev.prev.value
def test():
    dll = List()
    n = list(map(Node, [71]))
    dll.start = n[0]
    dll.end = n[0]
    dll._length = 1
    return dll.get_value(0)
def test():
    dll = List()
    dll.insert(len(dll), 83)
    dll.insert(len(dll), 82)
    dll.insert(len(dll), 81)
    dll.insert(len(dll), 80)
    return dll.start.next.next.next.value
def test():
    dll = List()
    n = list(map(Node, [71]))
    dll.start = n[0]
    dll.end = n[0]
    dll._length = 1
    dll.get_value(-2)  # Exception raised here
    return "SHOULD RAISE EXCEPTION"
def test():
    dll = List()
    dll.prepend(1)
    dll.prepend(2)
    dll.prepend(3)
    v = f"{dll.start.value}{dll.start.next.value}{dll.start.next.next.value}"
    v += f"{dll.end.value}{dll.end.prev.value}{dll.end.prev.prev.value}"
    return v
def test():
    dll = List()
    n = list(map(Node, [9]))
    dll.start = n[0]
    dll.end = n[0]
    dll._length = 1
    dll.remove(9)
    v = f"{dll.start}"
    v += f"{dll.end}"
    v += f"{dll._length}"
    return v
def test():
    dll = List()
    n = list(map(Node, [0]))
    dll.start = n[0]
    dll.end = n[0]
    dll._length = 1
    v = f"{dll.pop(0)}"
    v += f"{dll.start}"
    v += f"{dll.end}"
    v += f"{dll._length}"
    return v
def test():
    dll = List()
    n = list(map(Node, [71, 72, 73]))
    dll.start = n[0]
    dll.start.next = n[1]
    dll.start.next.next = n[2]
    dll.end = n[2]
    dll.end.prev = n[1]
    dll.end.prev.prev = n[0]
    dll._length = 3
    return dll.get_value(-1)
def test():
    dll = List()
    n = list(map(Node, [71, 72]))
    dll.start = n[0]
    dll.start.next = n[1]
    dll.end = n[1]
    dll.end.prev = n[0]
    dll._length = 2
    dll.insert(-2, 33)
    v = f"{dll.start.value}{dll.start.next.value}{dll.start.next.next.value}{dll.start.next.next.next}"
    v += f"{dll.end.value}{dll.end.prev.value}{dll.end.prev.prev.value}{dll.end.prev.prev.prev}"
    return v
def test():
    dll = List()
    n = list(map(Node, [0, 1, 2]))
    dll.start = n[0]
    dll.start.next = n[1]
    dll.start.next.next = n[2]
    dll.end = n[2]
    dll.end.prev = n[1]
    dll.end.prev.prev = n[0]
    dll._length = 3
    dll.remove(5)  # Exception raised here
    return "SHOULD RAISE EXCEPTION"
def test():
    dll = List()
    n = list(map(Node, [0, 1]))
    dll.start = n[0]
    dll.start.next = n[1]
    dll.end = n[1]
    dll.end.prev = n[0]
    dll._length = 2
    v = f"{dll.pop(1)}"
    v += f"{dll.start.value}{dll.start.next}"
    v += f"{dll.end.value}{dll.end.prev}"
    v += f"{dll._length}"
    return v
def test():
    dll = List()
    n = list(map(Node, [9, 8, 7]))
    dll.start = n[0]
    dll.start.next = n[1]
    dll.start.next.next = n[2]
    dll.end = n[2]
    dll.end.prev = n[1]
    dll.end.prev.prev = n[0]
    dll._length = 3
    dll.remove(7)
    v = f"{dll.start.value}{dll.start.next.value}"
    v += f"{dll.end.value}{dll.end.prev.value}"
    return v
def test():
    dll = List()
    n = list(map(Node, [7, 8, 9]))
    dll.start = n[0]
    dll.start.next = n[1]
    dll.start.next.next = n[2]
    dll.end = n[2]
    dll.end.prev = n[1]
    dll.end.prev.prev = n[0]
    dll._length = 3
    val = dll.pop(-3)
    v = f"{val}"
    v += f"{dll.start.value}{dll.start.next.value}{dll.start.next.next}"
    v += f"{dll.end.value}{dll.end.prev.value}{dll.end.prev.prev}"
    return v
def test():
    dll = List()
    dll._length = 11
    return len(dll)

run(test, desc=desc, expected=30)

desc = "A call to `.insert()` links the `.end` attribute correctly."


def test():
    dll = List()
    dll.insert(0, 40)
    return dll.end.value


run(test, desc=desc, expected=40)

dll = List()
desc = "(1/4) - Multiple `.insert()` calls assign the appropriate nodes to `.start` and `.end`."


def test():
    global dll
    dll.insert(0, 51)
    if dll.start.value != 51 or dll.end.value != 51:
        return False
    return True


run(test, desc=desc, expected=True)

desc = "(2/4) - Multiple `.insert()` calls assign the appropriate nodes to `.start` and `.end`."
def test():
    dll = List()
    dll.insert(0, 33)
    v = f"{dll.start.value}"
    v += f"{dll.end.value}"
    return v
def test():
    dll = List()
    dll.insert(0, 30)
    return dll.start.value
def test():
    dll = List()
    return dll._length
def test():
    dll = List()
    dll.insert(0, 40)
    return dll.end.value
def test():
    dll = List()
    dll.append(100)
    return dll.end.value
def test():
    dll = List()
    dll.insert(0, 80)
    dll.insert(1, 81)
    dll.insert(-3, 83)  # Exception raised here
    return "SHOULD RAISE EXCEPTION"
def test():
    dll = List()
    dll.pop()  # Exception raised here
    return "SHOULD RAISE EXCEPTION"
def test():
    dll = List()
    return dll.end
def test():
    dll = List()
    return dll.start
def test():
    dll = List()
    dll.append(100)
    dll.append(101)
    return dll.start.value
def test():
    dll = List()
    dll.prepend(100)
    return dll.start.value
def test():
    dll = List()
    dll.get_value(0)  # Exception raised here
    return "SHOULD RAISE EXCEPTION"
def test():
    dll = List()
    dll.prepend(100)
    dll.prepend(101)
    return dll.end.value