UNPKG

@flatten-js/core

Version:

Javascript library for 2d geometry

202 lines (190 loc) 9.44 kB
'use strict'; import {expect} from 'chai'; import Flatten from '../../index'; import LinkedList from '../../src/data_structures/linked_list'; describe('#LinkedList', function () { it('May create new instance of LinkedList', function () { let list = new LinkedList(); expect(list).to.be.an.instanceof(LinkedList); expect(list.isEmpty()).to.be.true; }); it('May return size of empty linked list', function () { let list = new LinkedList(); expect(list.size).to.be.equal(0); }); it('May append element to empty linked list', function () { let list = new LinkedList(); let element = {val: "one", next: undefined, prev: undefined}; list.append(element); expect(list.size).to.be.equal(1); expect(list.first).to.be.equal(element); expect(list.last).to.be.equal(element); }); it('May append 5 elements to linked list', function () { let list = new LinkedList(); let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; list.append(element1); list.append(element2); list.append(element3); list.append(element4); list.append(element5); expect(list.size).to.be.equal(5); expect(list.first).to.be.equal(element1); expect(list.last).to.be.equal(element5); }); it('May insert element to the middle of linked list', function () { let list = new LinkedList(); let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; let element10 = {val: "ten", next: undefined, prev: undefined}; list.append(element1); list.append(element2); list.append(element3); list.append(element4); list.append(element5); list.insert(element10, element2); expect(list.size).to.be.equal(6); expect(element2.next).to.be.equal(element10); expect(element10.next).to.be.equal(element3); expect(element3.prev).to.be.equal(element10); expect(element10.prev).to.be.equal(element2); }); it('May insert element to the end of linked list', function () { let list = new LinkedList(); let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; let element10 = {val: "ten", next: undefined, prev: undefined}; list.append(element1); list.append(element2); list.append(element3); list.append(element4); list.append(element5); list.insert(element10, element5); expect(list.size).to.be.equal(6); expect(element5.next).to.be.equal(element10); expect(element10.prev).to.be.equal(element5); expect(list.last).to.be.equal(element10); }); it('May insert element to the beginning of linked list if elementBefore is null', function () { let list = new LinkedList(); let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; let element10 = {val: "ten", next: undefined, prev: undefined}; list.append(element1); list.append(element2); list.append(element3); list.append(element4); list.append(element5); list.insert(element10, null); expect(list.size).to.be.equal(6); expect(element1.prev).to.be.equal(element10); expect(element10.next).to.be.equal(element1); expect(list.first).to.be.equal(element10); }); it('May insert element to the empty list', function () { let list = new LinkedList(); let element1 = {val: "one", next: undefined, prev: undefined}; list.insert(element1); expect(list.size).to.be.equal(1); expect(list.first).to.be.equal(element1); expect(list.last).to.be.equal(element1); }); it('May remove element from the linked list', function () { let list = new LinkedList(); let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; list.append(element1); list.append(element2); list.append(element3); list.append(element4); list.append(element5); expect(list.size).to.be.equal(5); list.remove(element3); expect(list.size).to.be.equal(4); }); it('May remove all elements', function () { let list = new LinkedList(); let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; list.append(element1); list.append(element2); list.append(element3); list.append(element4); list.append(element5); expect(list.size).to.be.equal(5); list.remove(element1); list.remove(element2); list.remove(element3); list.remove(element4); list.remove(element5); expect(list.isEmpty()).to.be.true; expect(list.size).to.be.equal(0); }); it('May return array of all elements', function () { let list = new LinkedList(); let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; list.append(element1); list.append(element2); list.append(element3); list.append(element4); list.append(element5); let arr = list.toArray().map( elm => elm.val); expect(arr).to.be.deep.equal(["one","two","three","four","five"]) }); it('May construct linked list by first and last', function () { let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; element1.next = element2; element2.next = element3; element2.prev = element1; element3.next = element4; element3.prev = element2; element4.next = element5; element4.prev = element3; element5.prev = element4; let list = new LinkedList(element1, element5); expect(list.size).to.be.equal(5); expect(list.first).to.be.equal(element1); expect(list.last).to.be.equal(element5); let arr = list.toArray().map( elm => elm.val); expect(arr).to.be.deep.equal(["one","two","three","four","five"]) }); it('May throw error when infinite loop detected', function () { let element1 = {val: "one", next: undefined, prev: undefined}; let element2 = {val: "two", next: undefined, prev: undefined}; let element3 = {val: "three", next: undefined, prev: undefined}; let element4 = {val: "four", next: undefined, prev: undefined}; let element5 = {val: "five", next: undefined, prev: undefined}; element1.next = element2; element2.next = element3; element2.prev = element1; element3.next = element4; element3.prev = element2; element4.next = element5; element4.prev = element3; element5.prev = element4; element5.next = element3; // create circular link let list = new LinkedList(element1, element5); expect( () => LinkedList.testInfiniteLoop(element1)).to.throw(Flatten.Errors.INFINITE_LOOP.message) }); });