jasc
Version:
Jasc Another Service Container
119 lines (94 loc) • 3.8 kB
JavaScript
const createTree = require('./tree').createTree
describe('Tree', () => {
it('Grows', () => {
const tree = createTree()
const a = tree.add('a', null, 'a')
tree.add('b', a, 'b')
const roots = tree.getRoots()
expect(roots.length).toBe(1)
expect(roots[0].value).toBe('a')
expect(roots[0].children.size).toBe(1)
})
it('Can grow multiple roots', () => {
const tree = createTree()
tree.add('a', null, 'a')
tree.add('b', null, 'b')
const roots = tree.getRoots()
expect(roots.length).toBe(2)
expect(roots[0].value).toBe('a')
expect(roots[1].value).toBe('b')
})
it('Can fuse roots', () => {
const tree = createTree()
const a = tree.add('a', null, 'a')
const b = tree.add('b', null, 'b')
const c = tree.add('c', [a, b], 'c')
const d = tree.add('d', c, 'd')
const e = tree.add('e', c, 'e')
})
it('Can reach root from leaf', () => {
const tree = createTree()
const a = tree.add('a', null, 'a')
const b = tree.add('b', a, 'b')
tree.add('c', b, 'c')
expect(tree.get('c').parents.has(b))
expect(tree.get('b').parents.has(a))
})
it('Can traverse roots', () => {
const tree = createTree()
const a = tree.add('a', null, 'a')
const b = tree.add('b', a, 'b')
tree.add('c', b, 'c')
const d = tree.add('d', null, 'd')
const e = tree.add('e', d, 'e')
tree.add('f', e, 'f')
tree.add('g', e, 'g')
const h = tree.add('h', null, 'h')
tree.add('i', h, 'i')
let traversedValues = []
tree.traverseRoots(node => traversedValues.push(node.value))
//tree.dump()
expect(traversedValues).toEqual(['a','b','c','d','e','f','g','h','i'])
})
it('Can traverse roots with predicate', () => {
const tree = createTree();
const a = tree.add('a', null, 'a')
tree.add('b', a, 'b')
tree.add('c', null, 'c')
expect(tree.traverseRoots(n => n.key === 'd')).toBeFalsy()
expect(tree.traverseRoots(n => n.key === 'c')).toBeTruthy()
})
it('Can stop travesing when predicate matches', () => {
const tree = createTree();
let av = false, bv = false, cv = false, dv = false // v for visited
const a = tree.add('a', null, () => { av = true; return 'a' })
const b = tree.add('b', a, () => { bv = true; return 'b' })
tree.add('c', b, () => { cv = true; return 'c' })
tree.add('d', null, () => { dv = true; return 'd' })
tree.traverseRoots(n => n.value() === 'b')
expect(av && bv).toBeTruthy()
expect(cv && dv).toBeFalsy()
})
it('Can traverse parents', () => {
const tree = createTree()
const a = tree.add('a', null, 'a') // a b dependencies point downwards
const b = tree.add('b', null, 'b') // \ /
const c = tree.add('c', [a, b], 'c') // c
const d = tree.add('d', c, 'd') // / \
const e = tree.add('e', c, 'e') // d e
const parents = []
e.traverseParents(p => parents.push(p.key))
expect(parents).toEqual(['c','a','b'])
})
it('Can prevent redefining nodes', () => {
const tree = createTree()
tree.add('a')
expect(() => tree.add('a')).toThrowError(/Can't redefine/)
})
it('Returns new node values', () => {
const tree = createTree()
const node = tree.add('a')
node.value = 'b'
expect(tree.get('a').value).toBe('b')
})
})