nestedsetsjs
Version:
Nested sets structure with separated items and nodes
430 lines (338 loc) • 13.8 kB
JavaScript
var assert = require('assert')
var ns = require('../nestedsets.js')
describe('Properties', function () {
it('Data exists', function () {
var NestedSet = ns()
assert.equal(NestedSet.Data !== undefined, true)
})
it('Structure exists', function () {
var NestedSet = ns()
assert.equal(NestedSet.Structure !== undefined, true)
})
})
describe('setItem', function () {
it('Sets data for an item', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
assert.equal(NestedSet.Data[1], 10000)
})
})
describe('addRoot', function () {
it('Initializes the Nested Sets structure. Adds a root node and sets an item for it', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.addRoot(1, 1)
assert.equal(NestedSet.Structure[0].itemId, 1)
})
})
describe('addNode', function () {
it('Adds a new node to the specified parent node and sets an item for it', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 20000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
var errors = NestedSet.checkTree()
assert.equal(NestedSet.Structure[0].itemId === 1 && NestedSet.Structure[1].itemId === 2 && NestedSet.Structure[2].itemId === 3 && NestedSet.Structure[0].childs === 2 && NestedSet.Structure[1].childs === 1 && NestedSet.Structure[2].childs === 0 && errors.length === 0, true)
})
})
describe('checkTree', function () {
it('Checks a tree according to three rules', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
var errors = NestedSet.checkTree()
assert.equal(errors.length === 0, true)
})
it('Checks a crashed tree according to three rules', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
NestedSet.Structure[1].lkey = 30
var errors = NestedSet.checkTree()
assert.equal(errors.length !== 0, true)
})
})
describe('getNode', function () {
it('Gets a node by ID', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var node = NestedSet.getNode(parentNodeId)
assert.equal(node.itemId === 2, true)
})
})
describe('removeNode', function () {
it('Removes a node by its ID', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
NestedSet.removeNode(parentNodeId)
var errors = NestedSet.checkTree()
var rootNode = NestedSet.getNode(rootNodeId)
assert.equal(NestedSet.Structure[1] === undefined && NestedSet.Structure[2] === undefined && errors.length === 0 && rootNode.childs === 0, true)
})
})
describe('removeItem', function () {
it('Removes an item with its dependent nodes', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
NestedSet.removeItem(2)
var errors = NestedSet.checkTree()
var rootNode = NestedSet.getNode(1)
assert.equal(NestedSet.Structure[1] === undefined && NestedSet.Structure[2] === undefined && NestedSet.Data[2] === undefined && errors.length === 0 && rootNode.childs === 0, true)
})
it('Removes an item without its dependent nodes', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
NestedSet.setItem(4, 40000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var parentNode2Id = NestedSet.addNode(parentNodeId, 3)
NestedSet.addNode(parentNode2Id, 4)
NestedSet.removeItem(4)
var errors = NestedSet.checkTree()
var rootNode = NestedSet.getNode(1)
var parentNode = NestedSet.getNode(2)
var parentNode2 = NestedSet.getNode(3)
assert.equal(NestedSet.Structure[3] === undefined && NestedSet.Data[4] === undefined && errors.length === 0 && rootNode.childs === 2 && parentNode.childs === 1 && parentNode2.childs === 0, true)
})
})
describe('moveNode', function () {
it('Move a node up the tree', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
NestedSet.setItem(4, 40000)
NestedSet.setItem(5, 50000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
var parentNode2Id = NestedSet.addNode(rootNodeId, 4)
var childNode2Id = NestedSet.addNode(parentNode2Id, 5)
NestedSet.moveNode(parentNodeId, childNode2Id)
var parent = NestedSet.getParent(parentNodeId)
var errors = NestedSet.checkTree()
assert.equal(parent._id === childNode2Id && errors.length === 0, true)
})
it('Move a node down the tree', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
NestedSet.setItem(4, 40000)
NestedSet.setItem(5, 50000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
var parentNode2Id = NestedSet.addNode(rootNodeId, 4)
NestedSet.addNode(parentNode2Id, 5)
NestedSet.moveNode(parentNode2Id, childNodeId)
var parent = NestedSet.getParent(parentNode2Id)
var errors = NestedSet.checkTree()
assert.equal(parent._id === childNodeId && errors.length === 0, true)
})
it('Move a node within the same branch', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
NestedSet.setItem(4, 40000)
NestedSet.setItem(5, 50000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var parentNode2Id = NestedSet.addNode(parentNodeId, 3)
var parentNode3Id = NestedSet.addNode(parentNode2Id, 4)
var parentNode4Id = NestedSet.addNode(parentNode3Id, 5)
NestedSet.moveNode(parentNode4Id, parentNode2Id)
var parent = NestedSet.getParent(parentNode4Id)
var errors = NestedSet.checkTree()
assert.equal(parent._id === parentNode2Id && errors.length === 0, true)
})
})
describe('getNodes', function () {
it('Returns all nodes (Structure property)', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
var nodes = NestedSet.getNodes()
assert.equal(nodes[0].itemId === 1 && nodes[1].itemId === 2 && nodes[2].itemId === 3, true)
})
})
describe('removeNodes', function () {
it('Removes all nodes (items are not destroyed)', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
NestedSet.removeNodes()
assert.equal(NestedSet.Structure.length, 0)
})
})
describe('getParent', function () {
it('Returns the first parent for the node', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
var parentNode = NestedSet.getParent(childNodeId)
assert.equal(parentNode._id, parentNodeId)
})
})
describe('getParents', function () {
it('Returns all parents of the node', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
var parents = NestedSet.getParents(childNodeId)
assert.equal(parents[0]._id === rootNodeId && parents[1]._id === parentNodeId && parents.length === 2, true)
})
})
describe('getChilds', function () {
it('Returns nested nodes in a node', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
var childs = NestedSet.getChilds(rootNodeId)
assert.equal(childs[0]._id === parentNodeId && childs[1]._id === childNodeId && childs.length === 2, true)
})
})
describe('getBranch', function () {
it('Returns the entire branch that contains the node', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
var branch = NestedSet.getBranch(parentNodeId)
assert.equal(branch[0]._id === rootNodeId && branch[1]._id === parentNodeId && branch[2]._id === childNodeId && branch.length === 3, true)
})
})
describe('getTree', function () {
it('Returns the entire structure (nodes and items)', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
var tree = NestedSet.getTree()
assert.equal(
tree[0]._id === rootNodeId &&
tree[1]._id === parentNodeId &&
tree[2]._id === childNodeId &&
tree.length === 3 &&
tree[0].data === 10000 &&
tree[1].data === 20000 &&
tree[2].data === 30000,
true
)
})
})
describe('clearAll', function () {
it('Removes all items and all nodes', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
NestedSet.clearAll()
assert.equal(NestedSet.Structure.length === 0 && Object.keys(NestedSet.Data).length === 0, true)
})
})
describe('isRoot', function () {
it('Checks if a node is root', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
assert.equal(NestedSet.isRoot(rootNodeId) && !NestedSet.isRoot(parentNodeId) && !NestedSet.isRoot(childNodeId), true)
})
})
describe('isBranch', function () {
it('Checks if a node is a parent', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
assert.equal(NestedSet.isBranch(rootNodeId) && NestedSet.isBranch(parentNodeId) && !NestedSet.isBranch(childNodeId), true)
})
})
describe('isLeaf', function () {
it('Checks if a node is the end of a branch', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
var childNodeId = NestedSet.addNode(parentNodeId, 3)
assert.equal(!NestedSet.isLeaf(rootNodeId) && !NestedSet.isLeaf(parentNodeId) && NestedSet.isLeaf(childNodeId), true)
})
})
describe('debug', function () {
it('Displays information about nodes and items', function () {
var NestedSet = ns()
NestedSet.setItem(1, 10000)
NestedSet.setItem(2, 20000)
NestedSet.setItem(3, 30000)
var rootNodeId = NestedSet.addRoot(1, 1)
var parentNodeId = NestedSet.addNode(rootNodeId, 2)
NestedSet.addNode(parentNodeId, 3)
var debug = NestedSet.debug()
assert.equal(debug.length === 3, true)
})
})