/* global libloki, assert */ describe('ServiceNodes', () => { describe('#consolidateLists', () => { it('should throw when provided a non-iterable list', () => { assert.throws( () => libloki.serviceNodes.consolidateLists(null, 1), Error ); }); it('should throw when provided a non-iterable item in the list', () => { assert.throws( () => libloki.serviceNodes.consolidateLists([1, 2, 3], 1), Error ); }); it('should throw when provided a non-number threshold', () => { assert.throws( () => libloki.serviceNodes.consolidateLists([], 'a'), 'Provided threshold is not a number' ); }); it('should throw when provided a non-function selector', () => { [1, 'a', 0xffffffff, { really: 'not a function' }].forEach(x => { assert.throws( () => libloki.serviceNodes.consolidateLists([], 1, x), 'Provided selector is not a function' ); }); }); it('should return an empty array when the input is an empty array', () => { const result = libloki.serviceNodes.consolidateLists([], 1); assert.deepEqual(result, []); }); it('should return the input when only 1 list is provided', () => { const result = libloki.serviceNodes.consolidateLists( [['a', 'b', 'c']], 1 ); assert.deepEqual(result, ['a', 'b', 'c']); }); it('should return the union of all lists when threshold is 0', () => { const result = libloki.serviceNodes.consolidateLists( [['a', 'b', 'c', 'h'], ['d', 'e', 'f', 'g'], ['g', 'h']], 0 ); assert.deepEqual(result.sort(), ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']); }); it('should use the selector to identify the elements', () => { const result = libloki.serviceNodes.consolidateLists( [ [ { id: 1, val: 'a' }, { id: 2, val: 'b' }, { id: 3, val: 'c' }, { id: 8, val: 'h' }, ], [ { id: 4, val: 'd' }, { id: 5, val: 'e' }, { id: 6, val: 'f' }, { id: 7, val: 'g' }, ], [{ id: 7, val: 'g' }, { id: 8, val: 'h' }], ], 0, x => x.id ); const expected = [ { id: 1, val: 'a' }, { id: 2, val: 'b' }, { id: 3, val: 'c' }, { id: 4, val: 'd' }, { id: 5, val: 'e' }, { id: 6, val: 'f' }, { id: 7, val: 'g' }, { id: 8, val: 'h' }, ]; assert.deepEqual(result.sort((a, b) => a.val > b.val), expected); }); it('should return the intersection of all lists when threshold is 1', () => { const result = libloki.serviceNodes.consolidateLists( [['a', 'b', 'c', 'd'], ['a', 'e', 'f', 'g'], ['a', 'h']], 1 ); assert.deepEqual(result, ['a']); }); it('should return the elements that have an occurence >= the provided threshold', () => { const result = libloki.serviceNodes.consolidateLists( [ ['a', 'b', 'c', 'd', 'e', 'f', 'g'], ['a', 'b', 'c', 'd', 'e', 'f', 'h'], ['a', 'b', 'c', 'd', 'e', 'f', 'g'], ['a', 'b', 'c', 'd', 'e', 'g', 'h'], ], 3 / 4 ); assert.deepEqual(result, ['a', 'b', 'c', 'd', 'e', 'f', 'g']); }); it('should work with sets as well', () => { const result = libloki.serviceNodes.consolidateLists( new Set([ new Set(['a', 'b', 'c', 'd', 'e', 'f', 'g']), new Set(['a', 'b', 'c', 'd', 'e', 'f', 'h']), new Set(['a', 'b', 'c', 'd', 'e', 'f', 'g']), new Set(['a', 'b', 'c', 'd', 'e', 'g', 'h']), ]), 3 / 4 ); assert.deepEqual(result, ['a', 'b', 'c', 'd', 'e', 'f', 'g']); }); }); });