/* 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']); }); }); });