50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
// Copyright 2024 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
// Only for tests. Use this to generate multiple test cases for a config matrix.
|
|
//
|
|
// Example:
|
|
//
|
|
// generateConfigMatrix({
|
|
// contacts: [20, 30],
|
|
// hasNotification: [false, true],
|
|
// });
|
|
//
|
|
// Outputs:
|
|
//
|
|
// [
|
|
// { contacts: 20, hasNotification: false },
|
|
// { contacts: 30, hasNotification: false },
|
|
// { contacts: 20, hasNotification: true },
|
|
// { contacts: 30, hasNotification: true },
|
|
// ]
|
|
export function generateConfigMatrix<Config>(combinations: {
|
|
[K in keyof Config]: ReadonlyArray<Config[K]>;
|
|
}): ReadonlyArray<Config> {
|
|
let result = [{} as Record<string, unknown>];
|
|
|
|
const entries = [...Object.entries(combinations)] as Array<
|
|
[string, ReadonlyArray<unknown>]
|
|
>;
|
|
if (
|
|
entries.length === 0 ||
|
|
entries.every(([, values]) => values.length === 0)
|
|
) {
|
|
return [];
|
|
}
|
|
|
|
for (const [key, values] of entries) {
|
|
result = values
|
|
// Make a copy of each existing result for each value
|
|
// eslint-disable-next-line no-loop-func
|
|
.map(value =>
|
|
result.map(config => ({
|
|
...config,
|
|
[key]: value,
|
|
}))
|
|
)
|
|
.flat();
|
|
}
|
|
|
|
return result as ReadonlyArray<Config>;
|
|
}
|