little-ds-toolkit
Version:
A small collection of useful data structures
78 lines (66 loc) • 1.7 kB
JavaScript
/* eslint-env node, mocha */
var assert = require('chai').assert
var UnionFind = require('../lib/union-find')
describe('union-find', function () {
var a, b, c, d
beforeEach(function () {
a = new UnionFind('a')
b = new UnionFind('b')
c = new UnionFind('c')
d = new UnionFind('d')
})
it('must be a function', function () {
assert.isFunction(UnionFind)
})
it('must return leader', function () {
assert.equal(a.find(), a)
})
it('must perform union', function () {
a.union(b)
assert.equal(a.find(), b)
assert.equal(b.find(), b)
})
it('must increase rank if equal', function () {
a.union(b)
assert.equal(a.rank, 0)
assert.equal(b.rank, 1)
})
it('must not increase rank if not equal', function () {
a.union(b)
a.union(c)
a.union(d)
assert.equal(a.rank, 0)
assert.equal(b.rank, 1)
assert.equal(c.rank, 0)
assert.equal(d.rank, 0)
})
it('must increase rank with 2 groups', function () {
a.union(b)
c.union(d)
a.union(c)
assert.equal(a.rank, 0)
assert.equal(b.rank, 1)
assert.equal(c.rank, 0)
assert.equal(d.rank, 2)
})
describe('path compression', function () {
beforeEach(function () {
a.union(b)
c.union(d)
a.union(c)
})
it('must verify topology', function () {
assert.equal(a.leader, b)
assert.equal(b.leader, d)
assert.equal(c.leader, d)
assert.equal(d.leader, d)
})
it('must find and apply compression', function () {
assert.equal(a.find(), d)
assert.equal(a.leader, d)
assert.equal(b.leader, d)
assert.equal(c.leader, d)
assert.equal(d.leader, d)
})
})
})