class Queue(object): """Create a queue data structure""" def __init__(self): self.container = DoubleLinkedList() def enqueue(self, val): """Inserts value to queue""" self.container.insert(val) def dequeue(self): """Removes next item and returns it""" return self.container.shift() def peek(self): """Return next value in queue without dequeuing it""" if self.container.tail_node is None: return None return self.container.tail_node.value def size(self): """Return size of queue, 0 if empty""" if self.container.head_node is None: return 0 cursor = self.container.head_node if self.container.head_node.next == self.container.tail_sentinal: return 1 size = 1 while cursor.next != self.container.tail_sentinal: size += 1 cursor = cursor.next return size
def test_remove_value_not_in_list(): from double_linked_list import DoubleLinkedList dll = DoubleLinkedList() dll.append(5) dll.insert(10) dll.append(15) dll.insert(20) with pytest.raises(ValueError): dll.remove('bananas')
def test_pop(): from double_linked_list import DoubleLinkedList dll = DoubleLinkedList() dll.append(5) dll.insert(10) dll.append(15) dll.insert(20) return_value_1 = dll.pop() assert return_value_1 == 20 assert dll.head_node.value == 10
def test_remove_tail(): from double_linked_list import DoubleLinkedList dll = DoubleLinkedList() dll.insert(3) dll.insert(2) dll.insert(1) assert dll.tail_node.value == 3 dll.remove(3) assert dll.tail_node.value == 2 assert dll.tail_node.next == dll.tail_sentinal
def test_remove_value(): from double_linked_list import DoubleLinkedList dll = DoubleLinkedList() dll.insert(3) dll.insert(2) dll.insert(1) dll.remove(2) assert dll.head_node.next.value == 3 assert dll.tail_node.value == 3 assert dll.tail_node.previous == dll.head_node
def test_shift(): from double_linked_list import DoubleLinkedList dll = DoubleLinkedList() dll.append(5) dll.insert(10) dll.append(15) dll.insert(20) # [20, 10, 5, 15] return_value_1 = dll.shift() assert return_value_1 == 15 assert dll.tail_node.value == 5
def test_insert(): # test multiple insert calls from double_linked_list import DoubleLinkedList dll = DoubleLinkedList() dll.insert(5) dll.insert(10) assert dll.head_node.value == 10 assert dll.head_node.next.value == 5 assert dll.head_node.previous == dll.head_sentinal assert dll.tail_node.value == 5 assert dll.tail_node.next == dll.tail_sentinal assert dll.tail_node.previous == dll.head_node
def test_insert_on_empty_list(): # test insert single element to empty list from double_linked_list import DoubleLinkedList dll = DoubleLinkedList() dll.insert(5) assert dll.head_node.value == 5 assert dll.head_node.next == dll.tail_sentinal assert dll.head_node.previous == dll.head_sentinal # list is 1 element long, so head and tail are that element assert dll.tail_node.value == 5 assert dll.tail_node.next == dll.tail_sentinal assert dll.tail_node.previous == dll.head_sentinal
class TestDoubleLinkedList(unittest.TestCase): def setUp(self): self.double_list = DoubleLinkedList() def test_insert_one_item(self): self.assertEqual(0, self.double_list.size) self.assertEqual(None, self.double_list.root) item1 = create_item(1, 1) self.double_list.insert(item1) self.assertEqual(1, self.double_list.size) self.assertEqual(item1, self.double_list.root) self.assertEqual(None, self.double_list.root.next) self.assertEqual(None, self.double_list.root.before) def test_insert_two_items(self): self.assertEqual(0, self.double_list.size) self.assertEqual(None, self.double_list.root) item1 = create_item(1, 1) item2 = create_item(2, 2) self.double_list.insert(item1) self.double_list.insert(item2) self.assertEqual(2, self.double_list.size) self.assertEqual(item1, self.double_list.root) self.assertEqual(item2, self.double_list.root.next) self.assertEqual(None, self.double_list.root.next.next) self.assertEqual(item1, self.double_list.root.next.before) def test_insert_three_items(self): self.assertEqual(0, self.double_list.size) self.assertEqual(None, self.double_list.root) item1 = create_item(1, 1) item2 = create_item(2, 2) item3 = create_item(3, 3) self.double_list.insert(item1) self.double_list.insert(item2) self.double_list.insert(item3) self.assertEqual(3, self.double_list.size) self.assertEqual(item1, self.double_list.root) self.assertEqual(item2, self.double_list.root.next) self.assertEqual(item1, self.double_list.root.next.before) self.assertEqual(item3, self.double_list.root.next.next) self.assertEqual(item2, self.double_list.root.next.next.before) self.assertEqual(item1, self.double_list.root.next.next.before.before) def test_search_item_exist(self): item1 = create_item(1, 1) item2 = create_item(2, 2) item3 = create_item(3, 3) self.double_list.insert(item1) self.double_list.insert(item2) self.double_list.insert(item3) self.assertEqual(item3, self.double_list.search(item3.id_)) def test_search_item_not_exist(self): item1 = create_item(1, 1) item2 = create_item(2, 2) item3 = create_item(3, 3) self.double_list.insert(item1) self.double_list.insert(item2) self.double_list.insert(item3) self.assertEqual(None, self.double_list.search(4)) def test_search_in_list_empty(self): self.assertEqual(None, self.double_list.search(1)) def test_remove_last_item(self): item1 = create_item(1, 1) item2 = create_item(2, 2) item3 = create_item(3, 3) self.double_list.insert(item1) self.double_list.insert(item2) self.double_list.insert(item3) item_removed = self.double_list.delete(item3.id_) self.assertEqual(item3, item_removed) self.assertEqual(2, self.double_list.size) self.assertEqual(item1, self.double_list.root) self.assertEqual(item2, self.double_list.root.next) def test_remove_first_item(self): item1 = create_item(1, 1) item2 = create_item(2, 2) item3 = create_item(3, 3) self.double_list.insert(item1) self.double_list.insert(item2) self.double_list.insert(item3) item_removed = self.double_list.delete(item1.id_) self.assertEqual(item1, item_removed) self.assertEqual(2, self.double_list.size) self.assertEqual(item2, self.double_list.root) self.assertEqual(item3, self.double_list.root.next) def test_remove_middle_item(self): item1 = create_item(1, 1) item2 = create_item(2, 2) item3 = create_item(3, 3) self.double_list.insert(item1) self.double_list.insert(item2) self.double_list.insert(item3) item_removed = self.double_list.delete(item2.id_) self.assertEqual(item2, item_removed) self.assertEqual(2, self.double_list.size) self.assertEqual(item1, self.double_list.root) self.assertEqual(item3, self.double_list.root.next)