64 lines
1.4 KiB
TypeScript
64 lines
1.4 KiB
TypeScript
|
// Copyright 2023 Signal Messenger, LLC
|
||
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||
|
|
||
|
import { assert } from 'chai';
|
||
|
import { groupWhile, formatGroups } from '../../util/groupWhile';
|
||
|
|
||
|
describe('groupWhile/formatGroups', () => {
|
||
|
function check(
|
||
|
input: Array<number>,
|
||
|
expected: Array<Array<number>>,
|
||
|
expectedFormatted: string
|
||
|
) {
|
||
|
const result = groupWhile(input, (item, prev) => {
|
||
|
return prev + 1 === item;
|
||
|
});
|
||
|
assert.deepEqual(result, expected);
|
||
|
const formatted = formatGroups(result, '-', ', ', String);
|
||
|
assert.equal(formatted, expectedFormatted);
|
||
|
}
|
||
|
|
||
|
it('empty', () => {
|
||
|
check([], [], '');
|
||
|
});
|
||
|
|
||
|
it('one', () => {
|
||
|
check([1], [[1]], '1');
|
||
|
});
|
||
|
|
||
|
it('sequential', () => {
|
||
|
check([1, 2, 3, 4, 5, 6], [[1, 2, 3, 4, 5, 6]], '1-6');
|
||
|
});
|
||
|
|
||
|
it('non-sequential', () => {
|
||
|
check(
|
||
|
[1, 2, 4, 5],
|
||
|
[
|
||
|
[1, 2],
|
||
|
[4, 5],
|
||
|
],
|
||
|
'1-2, 4-5'
|
||
|
);
|
||
|
});
|
||
|
|
||
|
it('multiple non-sequential', () => {
|
||
|
check(
|
||
|
[1, 2, 4, 5, 7, 9, 10],
|
||
|
[[1, 2], [4, 5], [7], [9, 10]],
|
||
|
'1-2, 4-5, 7, 9-10'
|
||
|
);
|
||
|
});
|
||
|
|
||
|
function range(start: number, end: number) {
|
||
|
return Array.from({ length: end - start + 1 }, (_, index) => start + index);
|
||
|
}
|
||
|
|
||
|
it('huge', () => {
|
||
|
check(
|
||
|
[...range(1, 100), ...range(102, 200), ...range(202, 300)],
|
||
|
[range(1, 100), range(102, 200), range(202, 300)],
|
||
|
'1-100, 102-200, 202-300'
|
||
|
);
|
||
|
});
|
||
|
});
|