def test_util_sublist_start_greater_than_end(self): with pytest.raises(IndexError): items = 10 dll = LinkedList() for i in range(items): dll.push(i) sublist(dll, 3, 2)
def test_remove_not_found(self): dll = LinkedList() assert dll.is_empty() is True assert dll.push(1) is None assert dll.is_empty() is False with pytest.raises(ValueError): dll.remove(2)
def test_pop_2nd_negative(self): dll = LinkedList() items = 100 assert dll.head is None assert dll.tail is None assert dll.size == 0 for i in range(items - 1, -1, -1): assert dll.push(i) is None assert isinstance(dll.head, Node) assert isinstance(dll.head.next, Node) assert dll.head.prev is None assert isinstance(dll.tail, Node) assert isinstance(dll.tail.prev, Node) assert dll.tail.next is None assert dll.size == items for j in range(items - 2, 0, -1): second = dll.pop(-2) assert isinstance(second, Node) assert second.next is None assert second.prev is None assert second.data == j assert isinstance(dll.head, Node) assert isinstance(dll.head.next, Node) assert dll.head.prev is None assert isinstance(dll.tail, Node) assert isinstance(dll.tail.prev, Node) assert dll.tail.next is None assert dll.head.data == 0 assert dll.tail.data == items - 1 assert dll.size == 2
def test_pop_tails_negative(self): dll = LinkedList() items = 100 assert dll.head is None assert dll.tail is None assert dll.size == 0 for i in range(items - 1, -1, -1): assert dll.push(i) is None assert isinstance(dll.head, Node) assert isinstance(dll.head.next, Node) assert dll.head.prev is None assert isinstance(dll.tail, Node) assert isinstance(dll.tail.prev, Node) assert dll.tail.next is None assert dll.size == items for j in range(items - 1, -1, -1): assert isinstance(dll.tail, Node) tail = dll.pop(-1) assert isinstance(tail, Node) assert tail.data == j assert tail.next == None assert dll.size == items - (items - j) assert dll.head is None assert dll.tail is None assert dll.size == 0
def test_remove_single(self): dll = LinkedList() assert dll.is_empty() assert dll.push(1) is None assert dll.size == 1 assert dll.head is dll.tail assert dll.remove(1) is None assert dll.is_empty()
def test_pop_out_of_range_negative(self): dll = LinkedList() assert dll.head is None assert dll.tail is None assert dll.size == 0 assert dll.push(1) is None assert isinstance(dll.head, Node) assert isinstance(dll.tail, Node) assert dll.size == 1 with pytest.raises(IndexError): dll.pop(-2)
def test_push(self): dll = LinkedList() assert dll.head is None assert dll.tail is None assert dll.size == 0 assert dll.push(1) is None assert isinstance(dll.head, Node) assert isinstance(dll.tail, Node) assert dll.size == 1 assert dll.head.data == dll.tail.data assert dll.push(2) is None assert isinstance(dll.head, Node) assert isinstance(dll.head.next, Node) assert dll.head.prev is None assert isinstance(dll.tail, Node) assert isinstance(dll.tail.prev, Node) assert dll.tail.next is None assert dll.head.next == dll.tail assert dll.tail.prev == dll.head assert dll.size == 2 assert dll.head.data != dll.tail.data assert dll.head.data == 2 assert dll.tail.data == 1
def test_sublist(self): dll = LinkedList() items = 10 start, end = 0, 3 assert dll.head is None assert dll.size == 0 for i in range(items): assert dll.push(i) is None assert type(dll.head) is Node assert dll.size == 10 sl = sublist(dll, start, end) assert type(sl) is LinkedList assert type(sl.head) is Node assert sl.size == (end - start) compare = items - 1 for node in sl: assert node.data == compare compare -= 1
def test_insert_new_tail(self): dll = LinkedList() assert dll.is_empty() assert dll.push(1) is None assert isinstance(dll.head, Node) assert isinstance(dll.tail, Node) assert dll.head is dll.tail assert dll.size == 1 assert dll.insert(1, 2) is None assert isinstance(dll.head, Node) assert isinstance(dll.tail, Node) assert dll.head is not dll.tail assert dll.head.data == 1 assert dll.tail.data == 2 assert dll.head.next is dll.tail assert dll.head.prev is None assert dll.tail.prev is dll.head assert dll.tail.next is None assert dll.size == 2
def test_insert_new_head_negative_out_of_bounds(self): dll = LinkedList() assert dll.is_empty() assert dll.push(1) is None assert isinstance(dll.head, Node) assert isinstance(dll.tail, Node) assert dll.head is dll.tail assert dll.size == 1 assert dll.insert(-1000, 2) is None assert isinstance(dll.head, Node) assert isinstance(dll.tail, Node) assert dll.head is not dll.tail assert dll.head.data == 2 assert dll.tail.data == 1 assert dll.head.next is dll.tail assert dll.head.prev is None assert dll.tail.prev is dll.head assert dll.tail.next is None assert dll.size == 2
def test_push_multiple(self): dll = LinkedList() items = 100 assert dll.head is None assert dll.tail is None assert dll.size == 0 for i in range(items): assert dll.push(i) is None assert isinstance(dll.head, Node) assert dll.size == i + 1 assert isinstance(dll.head, Node) assert isinstance(dll.head.next, Node) assert dll.head.prev is None assert isinstance(dll.tail, Node) assert isinstance(dll.tail.prev, Node) assert dll.tail.next is None assert dll.size == items assert dll.head.data != dll.tail.data assert dll.head.data == items - 1 assert dll.tail.data == 0
def test_insert_new_tail_out_of_bounds(self): dll = LinkedList() assert dll.is_empty() assert dll.push(0) is None assert isinstance(dll.head, Node) assert isinstance(dll.tail, Node) assert dll.head is dll.tail assert dll.size == 1 assert dll.insert(1000, 1) is None assert isinstance(dll.head, Node) assert isinstance(dll.tail, Node) assert dll.head is not dll.tail assert dll.head.data == 0 assert dll.tail.data == 1 assert dll.head.next is dll.tail assert dll.head.next.data == 1 assert dll.head.prev is None assert dll.tail.prev is dll.head assert dll.tail.prev.data == 0 assert dll.tail.next is None assert dll.size == 2
def test_pop_single_negative(self): dll = LinkedList() assert dll.head is None assert dll.tail is None assert dll.size == 0 assert dll.push(1) is None assert isinstance(dll.head, Node) assert dll.head.next is None assert dll.head.prev is None assert isinstance(dll.tail, Node) assert dll.tail.next is None assert dll.tail.prev is None assert dll.head.data == dll.tail.data assert dll.size == 1 single = dll.pop(-1) assert isinstance(single, Node) assert single.data == 1 assert single.next is None assert single.prev is None assert dll.head is None assert dll.tail is None assert dll.size == 0
def test_sublist_halves(self): dll = LinkedList() items = 10 assert dll.head is None assert dll.size == 0 for i in range(items): assert dll.push(i) is None dll.reverse() def halves(linked_list, begin, end): mid = linked_list.size // 2 left = sublist(linked_list, begin, mid) right = sublist(linked_list, mid, end) return left, right def print_list(linked_list): for node in linked_list: print(node.data, end=',') print(" ") def check(linked_list): if linked_list.size <= 2: return left, right = halves(linked_list, 0, linked_list.size) if linked_list.size % 2: # Odds assert left.size == (linked_list.size // 2) assert right.size == (linked_list.size // 2 + 1) else: # Evens assert left.size == (linked_list.size // 2) assert right.size == (linked_list.size // 2) print_list(left) print_list(right) check(left) check(right) check(dll)
def test_pop_heads(self): dll = LinkedList() items = 100 assert dll.head is None assert dll.tail is None assert dll.size == 0 for i in range(items): assert dll.push(i) is None assert isinstance(dll.head, Node) assert isinstance(dll.head.next, Node) assert dll.head.prev is None assert isinstance(dll.tail, Node) assert isinstance(dll.tail.prev, Node) assert dll.tail.next is None assert dll.size == items for j in range(items - 1, -1, -1): assert isinstance(dll.head, Node) head = dll.pop() assert isinstance(head, Node) assert head.data == j assert dll.size == items - (items - j) assert dll.head is None assert dll.tail is None assert dll.size == 0