UNPKG

another-linked-list

Version:
194 lines (138 loc) 5.69 kB
import LinkedList from '../linked-list.js'; describe('LinkedList Class', () => { it('should create empty linked list', () => { const singlyLinkedList = new LinkedList(); expect(singlyLinkedList.head).toBeNull(); expect(singlyLinkedList.tail).toBeNull(); expect(singlyLinkedList.toString()).toBe(''); }); it('should append node to linked list', () => { const singlyLinkedList = new LinkedList(); expect(singlyLinkedList.head).toBeNull(); expect(singlyLinkedList.tail).toBeNull(); singlyLinkedList.append(1); singlyLinkedList.append(2); expect(singlyLinkedList.head).toEqual({ value: 1, next: {value: 2, next: null} }); expect(singlyLinkedList.tail).toEqual({ value: 2, next: null }); expect(singlyLinkedList.toString()).toBe('1,2'); }); it('should prepend node to linked list', () => { const singlyLinkedList = new LinkedList(); singlyLinkedList.prepend(2); expect(singlyLinkedList.head).toEqual({ value: 2, next: null }); expect(singlyLinkedList.tail).toEqual({ value: 2, next: null }); expect(singlyLinkedList.head.toString()).toBe('2'); expect(singlyLinkedList.tail.toString()).toBe('2'); singlyLinkedList.append(1); singlyLinkedList.prepend(3); expect(singlyLinkedList.toString()).toBe('3,2,1'); }); it('should delete node by value from linked list', () => { const linkedList = new LinkedList(); expect(linkedList.delete(5)).toBeNull(); linkedList.append(1); linkedList.append(1); linkedList.append(2); linkedList.append(3); linkedList.append(3); linkedList.append(3); linkedList.append(4); linkedList.append(5); expect(linkedList.head.toString()).toBe('1'); expect(linkedList.tail.toString()).toBe('5'); const deletedNode = linkedList.delete(3); expect(deletedNode.value).toBe(3); expect(linkedList.toString()).toBe('1,1,2,4,5'); linkedList.delete(3); expect(linkedList.toString()).toBe('1,1,2,4,5'); linkedList.delete(1); expect(linkedList.toString()).toBe('2,4,5'); expect(linkedList.head.toString()).toBe('2'); expect(linkedList.tail.toString()).toBe('5'); linkedList.delete(5); expect(linkedList.toString()).toBe('2,4'); expect(linkedList.head.toString()).toBe('2'); expect(linkedList.tail.toString()).toBe('4'); linkedList.delete(4); expect(linkedList.toString()).toBe('2'); expect(linkedList.head.toString()).toBe('2'); expect(linkedList.tail.toString()).toBe('2'); linkedList.delete(2); expect(linkedList.toString()).toBe(''); }); it('should delete linked list tail', () => { const linkedList = new LinkedList(); linkedList.append(1); linkedList.append(2); linkedList.append(3); expect(linkedList.head.toString()).toBe('1'); expect(linkedList.tail.toString()).toBe('3'); const deletedNode1 = linkedList.deleteTail(); expect(deletedNode1.value).toBe(3); expect(linkedList.toString()).toBe('1,2'); expect(linkedList.head.toString()).toBe('1'); expect(linkedList.tail.toString()).toBe('2'); const deletedNode2 = linkedList.deleteTail(); expect(deletedNode2.value).toBe(2); expect(linkedList.toString()).toBe('1'); expect(linkedList.head.toString()).toBe('1'); expect(linkedList.tail.toString()).toBe('1'); const deletedNode3 = linkedList.deleteTail(); expect(deletedNode3.value).toBe(1); expect(linkedList.toString()).toBe(''); expect(linkedList.head).toBeNull(); expect(linkedList.tail).toBeNull(); }); it('should delete linked list head', () => { const linkedList = new LinkedList(); expect(linkedList.deleteHead()).toBeNull(); linkedList.append(1); linkedList.append(2); expect(linkedList.head.toString()).toBe('1'); expect(linkedList.tail.toString()).toBe('2'); const deletedNode1 = linkedList.deleteHead(); expect(deletedNode1.value).toBe(1); expect(linkedList.toString()).toBe('2'); expect(linkedList.head.toString()).toBe('2'); expect(linkedList.tail.toString()).toBe('2'); const deletedNode2 = linkedList.deleteHead(); expect(deletedNode2.value).toBe(2); expect(linkedList.toString()).toBe(''); expect(linkedList.head).toBeNull(); expect(linkedList.tail).toBeNull(); }); it('should be possible to store objects in the list and to print them out', () => { const linkedList = new LinkedList(); const nodeValue1 = { value: 1, key: 'key1' }; const nodeValue2 = { value: 2, key: 'key2' }; linkedList .append(nodeValue1) .prepend(nodeValue2); const nodeStringifier = value => `${value.key}:${value.value}`; expect(linkedList.toString(nodeStringifier)).toBe('key2:2,key1:1'); }); it('should find node by value', () => { const linkedList = new LinkedList(); expect(linkedList.find({ value: 5 })).toBeNull(); linkedList.append(1); expect(linkedList.find({ value: 1 })).toBeDefined(); linkedList .append(2) .append(3); const node = linkedList.find({ value: 2 }); expect(node.value).toBe(2); expect(linkedList.find({ value: 5 })).toBeNull(); }); it('should find node by callback', () => { const linkedList = new LinkedList(); linkedList .append({ value: 1, key: 'test1' }) .append({ value: 2, key: 'test2' }) .append({ value: 3, key: 'test3' }); const node = linkedList.find({ callback: value => value.key === 'test2' }); expect(node).toBeDefined(); expect(node.value.value).toBe(2); expect(node.value.key).toBe('test2'); expect(linkedList.find({ callback: value => value.key === 'test5' })).toBeNull(); }); });