linkedlist-js
Version:
A Doubly Linked List Implementation in Javascript
302 lines (238 loc) • 7.8 kB
JavaScript
var expect = require("chai").expect;
var List = require('../src/List');
var Node = require('../src/Node');
describe('List class', function () {
describe('isEmpty method', function () {
it('Returns `true` if list is empty', function () {
var list = new List();
expect(list.isEmpty()).to.be.true;
});
it('Returns `false` if list is not empty', function () {
var list = new List();
list.push('TEST');
expect(list.isEmpty()).to.be.false;
});
});
describe('push method', function () {
it('Pushes a new Node onto the end', function () {
var list = new List();
expect(list.push('TEST1')).to.be.instanceOf(Node);
expect(list.isEmpty()).to.be.false;
expect(list.count()).to.be.equal(1);
expect(list.head().value()).to.be.equal('TEST1');
expect(list.tail().value()).to.be.equal('TEST1');
list.push('TEST2');
expect(list.count()).to.be.equal(2);
expect(list.tail().value()).to.be.equal('TEST2');
});
});
describe('pop method', function () {
it('Removes and Returns a Node off the end', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
list.push('TEST3');
expect(list.pop().value()).to.be.equal('TEST3');
expect(list.count()).to.be.equal(2);
expect(list.pop().value()).to.be.equal('TEST2');
expect(list.count()).to.be.equal(1);
expect(list.pop().value()).to.be.equal('TEST1');
expect(list.count()).to.be.equal(0);
expect(list.head()).to.be.null;
expect(list.tail()).to.be.null;
});
});
describe('unshift method', function () {
it('Adds a Node to the start of the List', function () {
var list = new List();
expect(list.unshift('2nd')).to.be.instanceOf(Node);
expect(list.head()).to.be.an.instanceOf(Node);
expect(list.tail()).to.be.an.instanceOf(Node);
expect(list.head().value()).to.be.an.equal('2nd');
expect(list.tail().value()).to.be.an.equal('2nd');
expect(list.get(0).value()).to.be.an.equal('2nd');
expect(list.count()).to.be.an.equal(1);
list.unshift('1st');
expect(list.head()).to.be.an.instanceOf(Node);
expect(list.head().value()).to.be.an.equal('1st');
expect(list.get(0).value()).to.be.an.equal('1st');
expect(list.count()).to.be.an.equal(2);
});
});
describe('shift method', function () {
it('Removes and Returns a Node off of the start', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
list.push('TEST3');
expect(list.shift().value()).to.be.equal('TEST1');
expect(list.count()).to.be.equal(2);
expect(list.shift().value()).to.be.equal('TEST2');
expect(list.count()).to.be.equal(1);
expect(list.shift().value()).to.be.equal('TEST3');
expect(list.count()).to.be.equal(0);
expect(list.head()).to.be.null;
expect(list.tail()).to.be.null;
});
});
describe('head method', function () {
it('Returns Null when list is empty', function () {
var list = new List();
expect(list.head()).to.be.null;
});
it('Returns a Node Object when list has atleast one Item', function () {
var list = new List();
list.push('TEST1');
expect(list.head()).to.be.an.instanceOf(Node);
expect(list.head().value()).to.be.equal('TEST1');
});
it('Returns the first Node in the list', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
expect(list.head().value()).to.be.equal('TEST1');
});
});
describe('tail method', function () {
it('Returns Null when list is empty', function () {
var list = new List();
expect(list.tail()).to.be.null;
});
it('Returns a Node Object when list has atleast one Item', function () {
var list = new List();
list.push('TEST1');
expect(list.tail()).to.be.an.instanceOf(Node);
expect(list.tail().value()).to.be.equal('TEST1');
});
it('Returns the last Node in the list', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
expect(list.tail().value()).to.be.equal('TEST2');
});
});
describe('count method', function () {
it('Returns the number of items in the list', function () {
var list = new List();
expect(list.count()).to.be.equal(0);
list.push('TEST1');
expect(list.count()).to.be.equal(1);
list.push('TEST2');
expect(list.count()).to.be.equal(2);
});
});
describe('get method', function () {
it('Returns the Node at the specified offset', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
list.push('TEST3');
expect(list.get(0).value()).to.be.equal('TEST1');
expect(list.get(1).value()).to.be.equal('TEST2');
expect(list.get(2).value()).to.be.equal('TEST3');
});
});
describe('set method', function () {
it('Sets the value of the node at the specified index', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
list.push('TEST3');
list.set(0, 'T1');
list.set(1, 'T2');
list.set(2, 'T3');
expect(list.get(0).value()).to.be.equal('T1');
expect(list.get(1).value()).to.be.equal('T2');
expect(list.get(2).value()).to.be.equal('T3');
});
});
describe('asArray method', function () {
it('Returns the whole list as an Array', function () {
var list = new List();
expect(list.asArray().length).to.be.equal(0);
list.push('TEST1');
expect(list.asArray().length).to.be.equal(1);
list.push('TEST2');
expect(list.asArray().length).to.be.equal(2);
list.push('TEST3');
expect(list.asArray().length).to.be.equal(3);
var arr = list.asArray();
expect(arr[0]).to.be.equal('TEST1');
expect(arr[1]).to.be.equal('TEST2');
expect(arr[2]).to.be.equal('TEST3');
});
});
describe('truncateTo method', function () {
it('truncates the list to the specified length', function () {
var list = new List();
list.truncateTo(0);
list.push('TEST1');
list.push('TEST2');
list.push('TEST3');
list.truncateTo(2);
expect(list.count()).to.be.equal(2);
expect(list.tail().value()).to.be.equal('TEST2');
expect(list.head().value()).to.be.equal('TEST1');
list.truncateTo(1);
expect(list.count()).to.be.equal(1);
expect(list.tail().value()).to.be.equal('TEST1');
expect(list.head().value()).to.be.equal('TEST1');
list.truncateTo(0);
expect(list.count()).to.be.equal(0);
expect(list.tail()).to.be.null;
expect(list.head()).to.be.null;
});
});
describe('empty method', function () {
it('empties the list', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
list.push('TEST3');
list.empty();
expect(list.count()).to.be.equal(0);
expect(list.head()).to.be.null;
expect(list.tail()).to.be.null;
});
});
describe('find method', function () {
it('Performs a linear search on the List and returns the Node if found', function () {
var list = new List();
list.push('TEST1');
var find = list.push('TEST2');
list.push('TEST3');
expect(list.find('TEST2')).to.be.equal(find);
});
it('Performs a linear search on the List and returns null if nto found', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
list.push('TEST3');
expect(list.find('TEST4')).to.be.null;
});
});
describe('each method', function () {
it('It helps traverse the list from head to tail in order', function () {
var list = new List();
list.push('TEST1');
list.push('TEST2');
list.push('TEST3');
var i = 0;
list.each(function (index, node) {
switch (index) {
case 0:
expect(node.value()).to.be.equal('TEST1');
break;
case 1:
expect(node.value()).to.be.equal('TEST2');
break;
case 2:
expect(node.value()).to.be.equal('TEST3');
break;
}
i++;
});
expect(i).to.be.equal(3);
});
});
});