aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modules/helpers/index.ts10
-rw-r--r--test/helpers.spec.ts8
2 files changed, 17 insertions, 1 deletions
diff --git a/src/modules/helpers/index.ts b/src/modules/helpers/index.ts
index 92647942..28c63693 100644
--- a/src/modules/helpers/index.ts
+++ b/src/modules/helpers/index.ts
@@ -649,6 +649,11 @@ export class HelpersModule {
* and outputs a unique array of strings based on that source.
* This method does not store the unique state between invocations.
*
+ * If there are not enough unique values to satisfy the length, if
+ * the source is an array, it will only return as many items as are
+ * in the array. If the source is a function, it will return after
+ * a maximum number of attempts has been reached.
+ *
* @template T The type of the elements.
*
* @param source The strings to choose from or a function that generates a string.
@@ -671,8 +676,11 @@ export class HelpersModule {
const set = new Set<T>();
try {
if (typeof source === 'function') {
- while (set.size < length) {
+ const maxAttempts = 1000 * length;
+ let attempts = 0;
+ while (set.size < length && attempts < maxAttempts) {
set.add(source());
+ attempts++;
}
}
} catch {
diff --git a/test/helpers.spec.ts b/test/helpers.spec.ts
index 67a2de3d..c7003dc8 100644
--- a/test/helpers.spec.ts
+++ b/test/helpers.spec.ts
@@ -806,6 +806,14 @@ describe('helpers', () => {
expect(unique).toHaveLength(input.length);
});
+ it('function with length longer than possible values returns', () => {
+ const fn = () => faker.helpers.arrayElement(['a', 'b']);
+ const length = 3;
+ const unique = faker.helpers.uniqueArray(fn, length);
+ expect(unique).not.toContainDuplicates();
+ expect(unique).toHaveLength(2);
+ });
+
it('works as expected when seeded', () => {
const input = ['a', 'a', 'a', 'a', 'a', 'f', 'g', 'h', 'i', 'j'];
const length = 5;