ba0fa4904b
Co-authored-by: Scott Nonnenberg <scott@signal.org>
63 lines
1.4 KiB
TypeScript
63 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'
|
|
);
|
|
});
|
|
});
|