Repository: dubzzz/fast-check
Pull request #2653 (2022-01-17 22:01:10)

⬆️ Bump rollup from 2.63.0 to 2.64.0 in /test/esm/rollup-with-require
Bumps [rollup](https://github.com/rollup/rollup) from 2.63.0 to 2.64.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/rollup/rollup/releases">rollup's releases</a>.</em></p>
<blockquote>
<h2>v2.64.0</h2>
<p><em>2022-01-14</em></p>
<h3>Features</h3>
<ul>
<li>Allow inspecting cached modules and forcing them to be transformed again via shouldTransformCachedModule (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4320">#4320</a>)</li>
<li>Do not wait for the config file to be parsed in watch mode if it is updated before that (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4344">#4344</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Do not mutate objects returned as <code>meta</code> from the resolveId hook (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4347">#4347</a>)</li>
</ul>
<h3>Pull Requests</h3>
<ul>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4326">#4326</a>: refactor: type fixes (<a href="https://github.com/dnalborczyk"><code>@​dnalborczyk</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4339">#4339</a>: More watch test stabilization (<a href="https://github.com/lukastaegert"><code>@​lukastaegert</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4340">#4340</a>: refactor: performance timers for node.js and browser (<a href="https://github.com/dnalborczyk"><code>@​dnalborczyk</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4341">#4341</a>: Implement shouldTransformCachedModule hook (<a href="https://github.com/lukastaegert"><code>@​lukastaegert</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4344">#4344</a>: Directly restart Rollup when config file change is detected in watch mode (<a href="https://github.com/lukastaegert"><code>@​lukastaegert</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4347">#4347</a>: Create a shallow copy when returning meta from resolveId (<a href="https://github.com/lukastaegert"><code>@​lukastaegert</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/rollup/rollup/blob/master/CHANGELOG.md">rollup's changelog</a>.</em></p>
<blockquote>
<h2>2.64.0</h2>
<p><em>2022-01-14</em></p>
<h3>Features</h3>
<ul>
<li>Allow inspecting cached modules and forcing them to be transformed again via shouldTransformCachedModule (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4320">#4320</a>)</li>
<li>Do not wait for the config file to be parsed in watch mode if it is updated before that (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4344">#4344</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Do not mutate objects returned as <code>meta</code> from the resolveId hook (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4347">#4347</a>)</li>
</ul>
<h3>Pull Requests</h3>
<ul>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4326">#4326</a>: refactor: type fixes (<a href="https://github.com/dnalborczyk"><code>@​dnalborczyk</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4339">#4339</a>: More watch test stabilization (<a href="https://github.com/lukastaegert"><code>@​lukastaegert</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4340">#4340</a>: refactor: performance timers for node.js and browser (<a href="https://github.com/dnalborczyk"><code>@​dnalborczyk</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4341">#4341</a>: Implement shouldTransformCachedModule hook (<a href="https://github.com/lukastaegert"><code>@​lukastaegert</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4344">#4344</a>: Directly restart Rollup when config file change is detected in watch mode (<a href="https://github.com/lukastaegert"><code>@​lukastaegert</code></a>)</li>
<li><a href="https://github-redirect.dependabot.com/rollup/rollup/pull/4347">#4347</a>: Create a shallow copy when returning meta from resolveId (<a href="https://github.com/lukastaegert"><code>@​lukastaegert</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/rollup/rollup/commit/82a3e2634a9d51b5040752e4fb2fd264651d504e"><code>82a3e26</code></a> 2.64.0</li>
<li><a href="https://github.com/rollup/rollup/commit/b1205b826418fb22e2f06ec2fd28db23ac028e79"><code>b1205b8</code></a> Update changelog</li>
<li><a href="https://github.com/rollup/rollup/commit/7c4728377fce727338b835d0dba3425319ec5626"><code>7c47283</code></a> refactor: performance timers for node.js and browser (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4340">#4340</a>)</li>
<li><a href="https://github.com/rollup/rollup/commit/edca64e2aa09c4728d848888b72d00577a37e7a1"><code>edca64e</code></a> Directly restart Rollup when config file change is detected in watch mode (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4">#4</a>...</li>
<li><a href="https://github.com/rollup/rollup/commit/9e947fcdb366bdfe69568f5940f43e43c4f3b796"><code>9e947fc</code></a> Create a shallow copy when returning meta from resolveId (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4347">#4347</a>)</li>
<li><a href="https://github.com/rollup/rollup/commit/1d2ea22b9889e4593f25c7142a58ffef71974d13"><code>1d2ea22</code></a> Implement shouldTransformCachedModule hook (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4341">#4341</a>)</li>
<li><a href="https://github.com/rollup/rollup/commit/da3bb43003e48fbb9815d9bd5aefee55d776b386"><code>da3bb43</code></a> More watch test stabilization (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4339">#4339</a>)</li>
<li><a href="https://github.com/rollup/rollup/commit/205e8611ba3f25f66678d4458e88f8db08869032"><code>205e861</code></a> refactor: type fixes (<a href="https://github-redirect.dependabot.com/rollup/rollup/issues/4326">#4326</a>)</li>
<li>See full diff in <a href="https://github.com/rollup/rollup/compare/v2.63.0...v2.64.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rollup&package-manager=npm_and_yarn&previous-version=2.63.0&new-version=2.64.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

codesandbox[bot]: This pull request is automatically built and testable in [CodeSandbox](https://codesandbox.io).

  To see build info of the built libraries, click [here](https://ci.codesandbox.io/status/dubzzz/fast-check/pr/2653/builds/208790) or the icon next to each commit SHA.

Latest deployment of this branch, based on commit 34d3f804e091149666cf3fe678b947cb0e6345e7:

|Sandbox| Source |
|--|--|
|[Vanilla](https://codesandbox.io/s/vanilla-1z1b8)| Configuration |
|[dubzzz/fast-check](https://codesandbox.io/s/dubzzz-fast-check-8ntl1)| Configuration |

codecov[bot]: # [Codecov](https://codecov.io/gh/dubzzz/fast-check/pull/2653?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN) Report
> Merging [#2653](https://codecov.io/gh/dubzzz/fast-check/pull/2653?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN) (34d3f80) into [main](https://codecov.io/gh/dubzzz/fast-check/commit/6a002dc827e0181e9eb066eacb37ee53f1a6e6b6?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN) (6a002dc) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/dubzzz/fast-check/pull/2653/graphs/tree.svg?width=650&height=150&src=pr&token=fRi2fJN730&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN)](https://codecov.io/gh/dubzzz/fast-check/pull/2653?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN)

```diff
@@           Coverage Diff           @@
##             main    #2653   +/-   ##
=======================================
  Coverage   95.02%   95.02%           
=======================================
  Files         209      209           
  Lines        4828     4828           
  Branches      944      944           
=======================================
  Hits         4588     4588           
  Misses        236      236           
  Partials        4        4           
```

| Flag | Coverage Δ | |
|---|---|---|
| unit-tests | `95.02% <ø> (ø)` | |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN#carryforward-flags-in-the-pull-request-comment) to find out more.


------

[Continue to review full report at Codecov](https://codecov.io/gh/dubzzz/fast-check/pull/2653?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/dubzzz/fast-check/pull/2653?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN). Last update [6a002dc...34d3f80](https://codecov.io/gh/dubzzz/fast-check/pull/2653?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Nicolas+DUBIEN).


Patch:
diff --git a/.github/workflows/build-status.yml b/.github/workflows/build-status.yml
index aead66f8..5a01d3ef 100644
--- a/.github/workflows/build-status.yml
+++ b/.github/workflows/build-status.yml
@@ -363,7 +363,7 @@ jobs:
           name: docs
           path: docs/
       - name: Publish to gh-pages
-        uses: JamesIves/github-pages-deploy-action@4.2.0
+        uses: JamesIves/github-pages-deploy-action@v4.2.2
         with:
           branch: gh-pages
           folder: docs
diff --git a/documentation/Arbitraries.md b/documentation/Arbitraries.md
index 663aeb12..7e8b10e9 100644
--- a/documentation/Arbitraries.md
+++ b/documentation/Arbitraries.md
@@ -50,6 +50,8 @@ fc.assert(
   - [More](#more)
 - [Others](#others)
 - [Going further?](#going-further)
+  - [Size explained](#size-explained)
+  - [Various links](#various-links)
 
 ## Boolean
 
@@ -675,7 +677,7 @@ fc.fullUnicode()
 *&#8195;with:*
 
 - `minLength?` — default: `0` — _minimal number of characters (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal number of characters (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal number of characters (included)_
 
 *&#8195;Usages*
 
@@ -757,7 +759,7 @@ fc.base64String({minLength: 4, maxLength: 12})
 *&#8195;with:*
 
 - `minLength?` — default: `0` — _minimal number of characters (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal number of characters (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal number of characters (included)_
 
 *&#8195;Usages*
 
@@ -796,7 +798,7 @@ fc.string({minLength: 4, maxLength: 6})
 *&#8195;with:*
 
 - `minLength?` — default: `0` — _minimal number of characters (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal number of characters (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal number of characters (included)_
 
 *&#8195;Usages*
 
@@ -835,7 +837,7 @@ fc.asciiString({minLength: 4, maxLength: 6})
 *&#8195;with:*
 
 - `minLength?` — default: `0` — _minimal number of characters (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal number of characters (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal number of characters (included)_
 
 *&#8195;Usages*
 
@@ -876,7 +878,7 @@ fc.unicodeString({minLength: 4, maxLength: 6})
 *&#8195;with:*
 
 - `minLength?` — default: `0` — _minimal number of characters (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal number of characters (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal number of characters (included)_
 
 *&#8195;Usages*
 
@@ -915,7 +917,7 @@ fc.string16bits({minLength: 4, maxLength: 6})
 *&#8195;with:*
 
 - `minLength?` — default: `0` — _minimal number of characters (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal number of characters (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal number of characters (included)_
 
 _Be aware that the length is considered in terms of the number of glyphs in the string and not the number of UTF-16 characters. As a consequence `generatedString.length` might be greater than the asked maximal length but `[...generatedString].length` will not and always be in the required range_
 
@@ -1621,7 +1623,7 @@ fc.date({ min: new Date("2000-01-01T00:00:00.000Z"), max: new Date("2000-12-31T2
 - `min?` — default: `-128` — _minimal value (included)_
 - `max?` — default: `127` — _maximal value (included)_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -1663,7 +1665,7 @@ fc.int8Array({min: 0, minLength: 1})
 - `min?` — default: `0` — _minimal value (included)_
 - `max?` — default: `255` — _maximal value (included)_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -1705,7 +1707,7 @@ fc.uint8Array({max: 42, minLength: 1})
 - `min?` — default: `0` — _minimal value (included)_
 - `max?` — default: `255` — _maximal value (included)_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -1747,7 +1749,7 @@ fc.uint8ClampedArray({max: 42, minLength: 1})
 - `min?` — default: `-32768` — _minimal value (included)_
 - `max?` — default: `32767` — _maximal value (included)_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -1789,7 +1791,7 @@ fc.int16Array({min: 0, minLength: 1})
 - `min?` — default: `0` — _minimal value (included)_
 - `max?` — default: `65535` — _maximal value (included)_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -1831,7 +1833,7 @@ fc.uint16Array({max: 42, minLength: 1})
 - `min?` — default: `-0x80000000` — _minimal value (included)_
 - `max?` — default: `0x7fffffff` — _maximal value (included)_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -1873,7 +1875,7 @@ fc.int32Array({min: 0, minLength: 1})
 - `min?` — default: `0` — _minimal value (included)_
 - `max?` — default: `0xffffffff` — _maximal value (included)_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -1917,7 +1919,7 @@ fc.uint32Array({max: 42, minLength: 1})
 - `noDefaultInfinity?` — default: `false` — _use finite values for `min` and `max` by default_
 - `noNaN?` — default: `false` — _do not generate `Number.NaN`_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -1961,7 +1963,7 @@ fc.float32Array({minLength: 1})
 - `noDefaultInfinity?` — default: `false` — _use finite values for `min` and `max` by default_
 - `noNaN?` — default: `false` — _do not generate `Number.NaN`_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -2386,7 +2388,7 @@ fc.genericTuple([fc.nat(), fc.string()])
 
 - `arb` — _arbitrary instance responsible to generate values_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 
 *&#8195;Usages*
 
@@ -2446,7 +2448,7 @@ fc.array(fc.nat(), {minLength: 5, maxLength: 7})
 
 - `arb` — _arbitrary instance responsible to generate values_
 - `minLength?` — default: `0` — _minimal length (included)_
-- `maxLength?` — default: `2 * minLength + 10` — _maximal length (included)_
+- `maxLength?` — default: `0x7fffffff` [more](#size-explained) — _maximal length (included)_
 - `compare?` — default: `{type: 'IsStrictlyEqual', selector: v => v}` equivalent to `(a, b) => a === b` — _custom compare operator used to distinguish duplicates in order to remove them from the resulting array. it can either be an object `{type,selector}` or a function returning `true` whenever items are equivalent (function-based is less optimized for large arrays)_
   - `type` can be one of:
     - `IsStrictlyEqual` to rely on `===` to compare items ([more details](https://tc39.es/ecma262/multipage/abstract-operations.html#sec-isstrictlyequal))
@@ -3709,6 +3711,16 @@ Refer to [Race conditions detection](./RaceConditions.md) or [Detect race condit
 
 ## Going further?
 
+### Size explained
+
+Whenever fast-check is called on an array-like arbitrary such as `fc.array` or `fc.string`, it is able to generate entries properly even if it does not receive any upper bound for the maximal length of the generated values.
+
+First, it sets `maxLength` to `0x7fffffff` — _the maximal allowed size for an array in JavaScript_.
+
+Then it sets an internal parameter called `maxGeneratedLength` to `2 * minLength + 10`. In other words, it does not generate entities having up to `0x7fffffff` but between entities having between `minLength` and `maxGeneratedLength` elements.
+
+### Various links
+
 - [API Reference](https://dubzzz.github.io/fast-check/)
 - [Advanced arbitraries (guide)](./AdvancedArbitraries.md)
 - [Model based testing or UI test](./Tips.md#model-based-testing-or-ui-test)
diff --git a/src/arbitrary/_internals/ArrayArbitrary.ts b/src/arbitrary/_internals/ArrayArbitrary.ts
index 4f213808..8f08a54b 100644
--- a/src/arbitrary/_internals/ArrayArbitrary.ts
+++ b/src/arbitrary/_internals/ArrayArbitrary.ts
@@ -67,7 +67,7 @@ export class ArrayArbitrary<T> extends NextArbitrary<T[]> {
     // Try to append into items up to the target size
     // We may reject some items as they are already part of the set
     // so we need to retry and generate other ones. In order to prevent infinite loop,
-    // we accept a max of maxLength consecutive failures. This circuit breaker may cause
+    // we accept a max of maxGeneratedLength consecutive failures. This circuit breaker may cause
     // generated to be smaller than the minimal accepted one.
     while (s.size() < N && numSkippedInRow < this.maxGeneratedLength) {
       const current = this.arb.generate(mrng, biasFactorItems);
diff --git a/src/arbitrary/_internals/helpers/MaxLengthFromMinLength.ts b/src/arbitrary/_internals/helpers/MaxLengthFromMinLength.ts
index 2eb89cd6..f21e54f8 100644
--- a/src/arbitrary/_internals/helpers/MaxLengthFromMinLength.ts
+++ b/src/arbitrary/_internals/helpers/MaxLengthFromMinLength.ts
@@ -1,7 +1,20 @@
+/**
+ * Shared upper bound for max length of array-like entities handled within fast-check
+ *
+ * "Every Array object has a non-configurable "length" property whose value is always a nonnegative integer less than 2^32."
+ * See {@link https://262.ecma-international.org/11.0/#sec-array-exotic-objects | ECMAScript Specifications}
+ *
+ * "The String type is the set of all ordered sequences [...] up to a maximum length of 2^53 - 1 elements."
+ * See {@link https://262.ecma-international.org/11.0/#sec-ecmascript-language-types-string-type | ECMAScript Specifications}
+ *
+ * @internal
+ */
+export const MaxLengthUpperBound = 0x7fffffff;
+
 /**
  * Compute `maxLength` based on `minLength`
  * @internal
  */
 export function maxLengthFromMinLength(minLength: number): number {
-  return Math.min(2 * minLength + 10, 0x7fffffff);
+  return Math.min(2 * minLength + 10, MaxLengthUpperBound);
 }
diff --git a/src/arbitrary/_internals/mappers/PatternsToString.ts b/src/arbitrary/_internals/mappers/PatternsToString.ts
index cb597d5d..9309e37b 100644
--- a/src/arbitrary/_internals/mappers/PatternsToString.ts
+++ b/src/arbitrary/_internals/mappers/PatternsToString.ts
@@ -24,6 +24,8 @@ export function patternsToStringUnmapperFor(
     }
 
     const minLength = constraints.minLength !== undefined ? constraints.minLength : 0;
+    // TODO(size) - No constraints on maxLength means that any length above minLength (included)
+    // is acceptable for value
     const maxLength = constraints.maxLength !== undefined ? constraints.maxLength : maxLengthFromMinLength(minLength);
     if (value.length === 0) {
       if (minLength > 0) {
diff --git a/src/arbitrary/array.ts b/src/arbitrary/array.ts
index e857c0dd..f0f598f4 100644
--- a/src/arbitrary/array.ts
+++ b/src/arbitrary/array.ts
@@ -1,7 +1,7 @@
 import { Arbitrary } from '../check/arbitrary/definition/Arbitrary';
 import { convertFromNext, convertToNext } from '../check/arbitrary/definition/Converters';
 import { ArrayArbitrary } from './_internals/ArrayArbitrary';
-import { maxLengthFromMinLength } from './_internals/helpers/MaxLengthFromMinLength';
+import { MaxLengthUpperBound, maxLengthFromMinLength } from './_internals/helpers/MaxLengthFromMinLength';
 
 /**
  * Constraints to be applied on {@link array}
@@ -71,15 +71,18 @@ function array<T>(arb: Arbitrary<T>, ...args: [] | [number] | [number, number] |
   const nextArb = convertToNext(arb);
   // fc.array(arb)
   if (args[0] === undefined) {
-    const maxLength = maxLengthFromMinLength(0);
-    return convertFromNext(new ArrayArbitrary<T>(nextArb, 0, maxLength, maxLength));
+    const maxGeneratedLength = maxLengthFromMinLength(0);
+    return convertFromNext(new ArrayArbitrary<T>(nextArb, 0, maxGeneratedLength, MaxLengthUpperBound));
   }
   // fc.array(arb, constraints)
   if (typeof args[0] === 'object') {
     const minLength = args[0].minLength || 0;
     const specifiedMaxLength = args[0].maxLength;
-    const maxLength = specifiedMaxLength !== undefined ? specifiedMaxLength : maxLengthFromMinLength(minLength);
-    return convertFromNext(new ArrayArbitrary<T>(nextArb, minLength, maxLength, maxLength));
+    const maxLength = specifiedMaxLength !== undefined ? specifiedMaxLength : MaxLengthUpperBound;
+    // TODO(size) - Make use of the (future) size argument to decide whether or not to apply maxLengthFromMinLength or take maxLength
+    const maxGeneratedLength =
+      specifiedMaxLength !== undefined ? specifiedMaxLength : maxLengthFromMinLength(minLength);
+    return convertFromNext(new ArrayArbitrary<T>(nextArb, minLength, maxGeneratedLength, maxLength));
   }
   // fc.array(arb, minLength, maxLength)
   if (args[1] !== undefined) {
diff --git a/src/arbitrary/base64String.ts b/src/arbitrary/base64String.ts
index 2ae45521..6aba9a08 100644
--- a/src/arbitrary/base64String.ts
+++ b/src/arbitrary/base64String.ts
@@ -77,6 +77,7 @@ function base64String(...args: StringFullConstraintsDefinition): Arbitrary<strin
   const unscaledMaxLength = constraints.maxLength;
 
   // base64 length is always a multiple of 4
+  // TODO(size) - No constraints on maxLength expected for array, if it has not been specified by the caller
   const minLength = unscaledMinLength + 3 - ((unscaledMinLength + 3) % 4);
   const maxLength = unscaledMaxLength - (unscaledMaxLength % 4);
 
diff --git a/src/arbitrary/set.ts b/src/arbitrary/set.ts
index e77b3104..10710d2f 100644
--- a/src/arbitrary/set.ts
+++ b/src/arbitrary/set.ts
@@ -1,7 +1,7 @@
 import { ArrayArbitrary } from './_internals/ArrayArbitrary';
 import { Arbitrary } from '../check/arbitrary/definition/Arbitrary';
 import { convertFromNext, convertToNext } from '../check/arbitrary/definition/Converters';
-import { maxLengthFromMinLength } from './_internals/helpers/MaxLengthFromMinLength';
+import { MaxLengthUpperBound, maxLengthFromMinLength } from './_internals/helpers/MaxLengthFromMinLength';
 import { CustomSetBuilder } from './_internals/interfaces/CustomSet';
 import { CustomEqualSet } from './_internals/helpers/CustomEqualSet';
 import { NextValue } from '../check/arbitrary/definition/NextValue';
@@ -29,17 +29,24 @@ function buildSetBuilder<T>(constraints: SetConstraints<T>): CustomSetBuilder<Ne
   }
 }
 
+/** @internal */
+type CompleteSetConstraints<T> = Required<Omit<SetConstraints<T>, 'compare'>> & {
+  setBuilder: CustomSetBuilder<NextValue<T>>;
+  maxGeneratedLength: number;
+};
+
 /**
  * Build fully set SetConstraints from a partial data
  * @internal
  */
-function buildCompleteSetConstraints<T>(
-  constraints: SetConstraints<T>
-): Required<Omit<SetConstraints<T>, 'compare'>> & { setBuilder: CustomSetBuilder<NextValue<T>> } {
+function buildCompleteSetConstraints<T>(constraints: SetConstraints<T>): CompleteSetConstraints<T> {
   const minLength = constraints.minLength !== undefined ? constraints.minLength : 0;
-  const maxLength = constraints.maxLength !== undefined ? constraints.maxLength : maxLengthFromMinLength(minLength);
+  const maxLength = constraints.maxLength !== undefined ? constraints.maxLength : MaxLengthUpperBound;
+  // TODO(size) - Make use of the (future) size argument to decide whether or not to apply maxLengthFromMinLength or take maxLength
+  const maxGeneratedLength =
+    constraints.maxLength !== undefined ? constraints.maxLength : maxLengthFromMinLength(minLength);
   const setBuilder = buildSetBuilder(constraints);
-  return { minLength, maxLength, setBuilder };
+  return { minLength, maxGeneratedLength, maxLength, setBuilder };
 }
 
 /**
@@ -246,10 +253,13 @@ function set<T>(
 
   const minLength = constraints.minLength;
   const maxLength = constraints.maxLength;
+  const maxGeneratedLength = constraints.maxGeneratedLength;
   const setBuilder = constraints.setBuilder;
 
   const nextArb = convertToNext(arb);
-  const arrayArb = convertFromNext(new ArrayArbitrary<T>(nextArb, minLength, maxLength, maxLength, setBuilder));
+  const arrayArb = convertFromNext(
+    new ArrayArbitrary<T>(nextArb, minLength, maxGeneratedLength, maxLength, setBuilder)
+  );
   if (minLength === 0) return arrayArb;
   return arrayArb.filter((tab) => tab.length >= minLength);
 }
diff --git a/src/arbitrary/sparseArray.ts b/src/arbitrary/sparseArray.ts
index cdd3ccf8..6bf39186 100644
--- a/src/arbitrary/sparseArray.ts
+++ b/src/arbitrary/sparseArray.ts
@@ -63,6 +63,10 @@ function arrayFromItems<T>(length: number, indexesAndValues: [number, T][]) {
 export function sparseArray<T>(arb: Arbitrary<T>, constraints: SparseArrayConstraints = {}): Arbitrary<T[]> {
   const {
     minNumElements = 0,
+    // TODO(size) - While from a generate point of view we want some limits using maxLengthFromMinLength
+    // makes us unable to shrink user inputs we could have potentially generated as we restrict our array
+    // to a smaller one (for generate reasons). Ideally maxLength should only be specified when there is
+    // a real need for them. For any other case, we should try not to pass them.
     maxNumElements = maxLengthFromMinLength(minNumElements),
     maxLength = Math.min(maxLengthFromMinLength(maxNumElements), 4294967295),
     noTrailingHole,


Test patch:
diff --git a/test/esm/rollup-with-import/package.json b/test/esm/rollup-with-import/package.json
index adfac21b..b98d6187 100644
--- a/test/esm/rollup-with-import/package.json
+++ b/test/esm/rollup-with-import/package.json
@@ -12,7 +12,7 @@
   "devDependencies": {
     "@rollup/plugin-commonjs": "^21.0.1",
     "@rollup/plugin-node-resolve": "^13.1.3",
-    "rollup": "^2.63.0"
+    "rollup": "^2.64.0"
   },
   "license": "MIT",
   "private": true
diff --git a/test/esm/rollup-with-import/yarn.lock b/test/esm/rollup-with-import/yarn.lock
index 51b9b301..51194557 100644
--- a/test/esm/rollup-with-import/yarn.lock
+++ b/test/esm/rollup-with-import/yarn.lock
@@ -223,10 +223,10 @@ resolve@^1.17.0, resolve@^1.19.0:
     is-core-module "^2.1.0"
     path-parse "^1.0.6"
 
-rollup@^2.63.0:
-  version "2.63.0"
-  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.63.0.tgz#fe2f7fec2133f3fab9e022b9ac245628d817c6bb"
-  integrity sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ==
+rollup@^2.64.0:
+  version "2.64.0"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.64.0.tgz#f0f59774e21fbb56de438a37d06a2189632b207a"
+  integrity sha512-+c+lbw1lexBKSMb1yxGDVfJ+vchJH3qLbmavR+awDinTDA2C5Ug9u7lkOzj62SCu0PKUExsW36tpgW7Fmpn3yQ==
   optionalDependencies:
     fsevents "~2.3.2"
 
diff --git a/test/esm/rollup-with-require/package.json b/test/esm/rollup-with-require/package.json
index adfac21b..b98d6187 100644
--- a/test/esm/rollup-with-require/package.json
+++ b/test/esm/rollup-with-require/package.json
@@ -12,7 +12,7 @@
   "devDependencies": {
     "@rollup/plugin-commonjs": "^21.0.1",
     "@rollup/plugin-node-resolve": "^13.1.3",
-    "rollup": "^2.63.0"
+    "rollup": "^2.64.0"
   },
   "license": "MIT",
   "private": true
diff --git a/test/esm/rollup-with-require/yarn.lock b/test/esm/rollup-with-require/yarn.lock
index 51b9b301..51194557 100644
--- a/test/esm/rollup-with-require/yarn.lock
+++ b/test/esm/rollup-with-require/yarn.lock
@@ -223,10 +223,10 @@ resolve@^1.17.0, resolve@^1.19.0:
     is-core-module "^2.1.0"
     path-parse "^1.0.6"
 
-rollup@^2.63.0:
-  version "2.63.0"
-  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.63.0.tgz#fe2f7fec2133f3fab9e022b9ac245628d817c6bb"
-  integrity sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ==
+rollup@^2.64.0:
+  version "2.64.0"
+  resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.64.0.tgz#f0f59774e21fbb56de438a37d06a2189632b207a"
+  integrity sha512-+c+lbw1lexBKSMb1yxGDVfJ+vchJH3qLbmavR+awDinTDA2C5Ug9u7lkOzj62SCu0PKUExsW36tpgW7Fmpn3yQ==
   optionalDependencies:
     fsevents "~2.3.2"
 
diff --git a/test/esm/webpack-with-import/package.json b/test/esm/webpack-with-import/package.json
index 87729f6d..c3832870 100644
--- a/test/esm/webpack-with-import/package.json
+++ b/test/esm/webpack-with-import/package.json
@@ -11,7 +11,7 @@
   },
   "devDependencies": {
     "querystring-es3": "^0.2.1",
-    "webpack": "^5.65.0",
+    "webpack": "^5.66.0",
     "webpack-cli": "^4.9.1"
   },
   "license": "MIT",
diff --git a/test/esm/webpack-with-import/yarn.lock b/test/esm/webpack-with-import/yarn.lock
index 980331d1..6a259022 100644
--- a/test/esm/webpack-with-import/yarn.lock
+++ b/test/esm/webpack-with-import/yarn.lock
@@ -400,10 +400,10 @@ glob-to-regexp@^0.4.1:
   resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
   integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
 
-graceful-fs@^4.1.2, graceful-fs@^4.2.4:
-  version "4.2.4"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
-  integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+  version "4.2.9"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
+  integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
 
 has-flag@^4.0.0:
   version "4.0.0"
@@ -795,10 +795,10 @@ webpack-sources@^3.2.2:
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260"
   integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==
 
-webpack@^5.65.0:
-  version "5.65.0"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.65.0.tgz#ed2891d9145ba1f0d318e4ea4f89c3fa18e6f9be"
-  integrity sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==
+webpack@^5.66.0:
+  version "5.66.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.66.0.tgz#789bf36287f407fc92b3e2d6f978ddff1bfc2dbb"
+  integrity sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==
   dependencies:
     "@types/eslint-scope" "^3.7.0"
     "@types/estree" "^0.0.50"
@@ -814,7 +814,7 @@ webpack@^5.65.0:
     eslint-scope "5.1.1"
     events "^3.2.0"
     glob-to-regexp "^0.4.1"
-    graceful-fs "^4.2.4"
+    graceful-fs "^4.2.9"
     json-parse-better-errors "^1.0.2"
     loader-runner "^4.2.0"
     mime-types "^2.1.27"
diff --git a/test/esm/webpack-with-require/package.json b/test/esm/webpack-with-require/package.json
index 87729f6d..c3832870 100644
--- a/test/esm/webpack-with-require/package.json
+++ b/test/esm/webpack-with-require/package.json
@@ -11,7 +11,7 @@
   },
   "devDependencies": {
     "querystring-es3": "^0.2.1",
-    "webpack": "^5.65.0",
+    "webpack": "^5.66.0",
     "webpack-cli": "^4.9.1"
   },
   "license": "MIT",
diff --git a/test/esm/webpack-with-require/yarn.lock b/test/esm/webpack-with-require/yarn.lock
index 980331d1..6a259022 100644
--- a/test/esm/webpack-with-require/yarn.lock
+++ b/test/esm/webpack-with-require/yarn.lock
@@ -400,10 +400,10 @@ glob-to-regexp@^0.4.1:
   resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
   integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
 
-graceful-fs@^4.1.2, graceful-fs@^4.2.4:
-  version "4.2.4"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
-  integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+  version "4.2.9"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
+  integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
 
 has-flag@^4.0.0:
   version "4.0.0"
@@ -795,10 +795,10 @@ webpack-sources@^3.2.2:
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260"
   integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==
 
-webpack@^5.65.0:
-  version "5.65.0"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.65.0.tgz#ed2891d9145ba1f0d318e4ea4f89c3fa18e6f9be"
-  integrity sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==
+webpack@^5.66.0:
+  version "5.66.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.66.0.tgz#789bf36287f407fc92b3e2d6f978ddff1bfc2dbb"
+  integrity sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==
   dependencies:
     "@types/eslint-scope" "^3.7.0"
     "@types/estree" "^0.0.50"
@@ -814,7 +814,7 @@ webpack@^5.65.0:
     eslint-scope "5.1.1"
     events "^3.2.0"
     glob-to-regexp "^0.4.1"
-    graceful-fs "^4.2.4"
+    graceful-fs "^4.2.9"
     json-parse-better-errors "^1.0.2"
     loader-runner "^4.2.0"
     mime-types "^2.1.27"
diff --git a/test/unit/arbitrary/__snapshots__/fullUnicodeString.spec.ts.snap b/test/unit/arbitrary/__snapshots__/fullUnicodeString.spec.ts.snap
index 19fd27eb..64665b5f 100644
--- a/test/unit/arbitrary/__snapshots__/fullUnicodeString.spec.ts.snap
+++ b/test/unit/arbitrary/__snapshots__/fullUnicodeString.spec.ts.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`fullUnicodeString (integration) should be able to shrink Hey 🐱! 1`] = `
+exports[`fullUnicodeString (integration) should be able to shrink Hey 🐱! with fc.fullUnicodeString() 1`] = `
 "\\"Hey 🐱!\\"
 ├> \\"\\"
 ├> \\" 🐱!\\"
@@ -121,3 +121,127 @@ exports[`fullUnicodeString (integration) should be able to shrink Hey 🐱! 1`]
 |  └> …
 └> …"
 `;
+
+exports[`fullUnicodeString (integration) should be able to shrink 🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱 with fc.fullUnicodeString() 1`] = `
+"\\"🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱\\"
+├> \\"\\"
+├> \\"🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱\\"
+|  ├> \\"🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱🐱\\"
+|  |  ├> \\"🐱🐱🐱🐱🐱🐱🐱\\"
+|  |  |  ├> \\"🐱🐱🐱🐱\\"
+|  |  |  |  ├> \\"🐱🐱\\"
+|  |  |  |  |  ├> \\"🐱\\"
+|  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  ├> \\" \\"
+|  |  |  |  |  |  |  └> \\"\\"
+|  |  |  |  |  |  ├> \\"︙\\"
+|  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  ├> \\"笍\\"
+|  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  ├> \\"㶇\\"
+|  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  ├> \\"Ễ\\"
+|  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  ├> \\"ར\\"
+|  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  ├> \\"ޱ\\"
+|  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  ├> \\"ϙ\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"ǭ\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"÷\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\\\u001d\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"^\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"?\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"0\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"(\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"$\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> \\"!\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |     └> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> \\"#\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |     └> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        ├> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |  └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        └> \\"!\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |           ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |           └> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |              └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"&\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> \\"%\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |     └> \\"$\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        ├> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |  └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        ├> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |  └> \\"!\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |     ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |     └> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |        └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        └> \\"#\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |           ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |           └> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |              ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |              ├> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |              |  └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |              └> \\"!\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |                 ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |                 └> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |                    └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> \\"'\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |     └> \\"&\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        ├> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |  └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        ├> \\"#\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |  └> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |     ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |     └> \\"!\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |        ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |        └> \\" \\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        |           └> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |        └> \\"%\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |           ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |           └> \\"$\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |              ├> \\"\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |              └> \\"#\\"
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |                 └> …
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  └> …
+|  |  |  |  |  └> …
+|  |  |  |  └> …
+|  |  |  └> …
+|  |  └> …
+|  └> …
+└> …"
+`;
diff --git a/test/unit/arbitrary/__snapshots__/string.spec.ts.snap b/test/unit/arbitrary/__snapshots__/string.spec.ts.snap
index 1c4d490a..9fc29979 100644
--- a/test/unit/arbitrary/__snapshots__/string.spec.ts.snap
+++ b/test/unit/arbitrary/__snapshots__/string.spec.ts.snap
@@ -1,6 +1,120 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`string (integration) should be able to shrink Hey! 1`] = `
+exports[`string (integration) should be able to shrink 00000000000000000000000000000000000000000000000000 with fc.string() 1`] = `
+"\\"00000000000000000000000000000000000000000000000000\\"
+├> \\"\\"
+├> \\"0000000000000000000000000\\"
+|  ├> \\"0000000000000\\"
+|  |  ├> \\"0000000\\"
+|  |  |  ├> \\"0000\\"
+|  |  |  |  ├> \\"00\\"
+|  |  |  |  |  ├> \\"0\\"
+|  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  ├> \\" \\"
+|  |  |  |  |  |  |  └> \\"\\"
+|  |  |  |  |  |  ├> \\"(\\"
+|  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  ├> \\"$\\"
+|  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  ├> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  |  └> \\"!\\"
+|  |  |  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |  |     └> \\" \\"
+|  |  |  |  |  |  |  |  |        └> \\"\\"
+|  |  |  |  |  |  |  |  └> \\"#\\"
+|  |  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |     └> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |        ├> \\"\\"
+|  |  |  |  |  |  |  |        ├> \\" \\"
+|  |  |  |  |  |  |  |        |  └> \\"\\"
+|  |  |  |  |  |  |  |        └> \\"!\\"
+|  |  |  |  |  |  |  |           ├> \\"\\"
+|  |  |  |  |  |  |  |           └> \\" \\"
+|  |  |  |  |  |  |  |              └> \\"\\"
+|  |  |  |  |  |  |  ├> \\"&\\"
+|  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  └> \\"%\\"
+|  |  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |     └> \\"$\\"
+|  |  |  |  |  |  |  |        ├> \\"\\"
+|  |  |  |  |  |  |  |        ├> \\" \\"
+|  |  |  |  |  |  |  |        |  └> \\"\\"
+|  |  |  |  |  |  |  |        ├> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |        |  ├> \\"\\"
+|  |  |  |  |  |  |  |        |  └> \\"!\\"
+|  |  |  |  |  |  |  |        |     ├> \\"\\"
+|  |  |  |  |  |  |  |        |     └> \\" \\"
+|  |  |  |  |  |  |  |        |        └> \\"\\"
+|  |  |  |  |  |  |  |        └> \\"#\\"
+|  |  |  |  |  |  |  |           ├> \\"\\"
+|  |  |  |  |  |  |  |           └> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |              ├> \\"\\"
+|  |  |  |  |  |  |  |              ├> \\" \\"
+|  |  |  |  |  |  |  |              |  └> \\"\\"
+|  |  |  |  |  |  |  |              └> \\"!\\"
+|  |  |  |  |  |  |  |                 ├> \\"\\"
+|  |  |  |  |  |  |  |                 └> \\" \\"
+|  |  |  |  |  |  |  |                    └> \\"\\"
+|  |  |  |  |  |  |  └> \\"'\\"
+|  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |     └> \\"&\\"
+|  |  |  |  |  |  |        ├> \\"\\"
+|  |  |  |  |  |  |        ├> \\" \\"
+|  |  |  |  |  |  |        |  └> \\"\\"
+|  |  |  |  |  |  |        ├> \\"#\\"
+|  |  |  |  |  |  |        |  ├> \\"\\"
+|  |  |  |  |  |  |        |  └> \\"\\\\\\"\\"
+|  |  |  |  |  |  |        |     ├> \\"\\"
+|  |  |  |  |  |  |        |     └> \\"!\\"
+|  |  |  |  |  |  |        |        ├> \\"\\"
+|  |  |  |  |  |  |        |        └> \\" \\"
+|  |  |  |  |  |  |        |           └> \\"\\"
+|  |  |  |  |  |  |        └> \\"%\\"
+|  |  |  |  |  |  |           ├> \\"\\"
+|  |  |  |  |  |  |           └> \\"$\\"
+|  |  |  |  |  |  |              ├> \\"\\"
+|  |  |  |  |  |  |              └> \\"#\\"
+|  |  |  |  |  |  |                 ├> \\"\\"
+|  |  |  |  |  |  |                 ├> \\" \\"
+|  |  |  |  |  |  |                 |  └> \\"\\"
+|  |  |  |  |  |  |                 └> \\"\\\\\\"\\"
+|  |  |  |  |  |  |                    ├> \\"\\"
+|  |  |  |  |  |  |                    └> \\"!\\"
+|  |  |  |  |  |  |                       ├> \\"\\"
+|  |  |  |  |  |  |                       └> \\" \\"
+|  |  |  |  |  |  |                          └> \\"\\"
+|  |  |  |  |  |  ├> \\",\\"
+|  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  ├> \\"*\\"
+|  |  |  |  |  |  |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |  └> \\")\\"
+|  |  |  |  |  |  |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |     └> \\"(\\"
+|  |  |  |  |  |  |  |        ├> \\"\\"
+|  |  |  |  |  |  |  |        ├> \\" \\"
+|  |  |  |  |  |  |  |        |  └> \\"\\"
+|  |  |  |  |  |  |  |        ├> \\"$\\"
+|  |  |  |  |  |  |  |        |  ├> \\"\\"
+|  |  |  |  |  |  |  |        |  ├> \\"\\\\\\"\\"
+|  |  |  |  |  |  |  |        |  |  ├> \\"\\"
+|  |  |  |  |  |  |  |        |  |  └> \\"!\\"
+|  |  |  |  |  |  |  |        |  |     ├> \\"\\"
+|  |  |  |  |  |  |  |        |  |     └> \\" \\"
+|  |  |  |  |  |  |  |        |  |        └> …
+|  |  |  |  |  |  |  |        |  └> …
+|  |  |  |  |  |  |  |        └> …
+|  |  |  |  |  |  |  └> …
+|  |  |  |  |  |  └> …
+|  |  |  |  |  └> …
+|  |  |  |  └> …
+|  |  |  └> …
+|  |  └> …
+|  └> …
+└> …"
+`;
+
+exports[`string (integration) should be able to shrink Hey! with fc.string() 1`] = `
 "\\"Hey!\\"
 ├> \\"\\"
 ├> \\"y!\\"
diff --git a/test/unit/arbitrary/array.spec.ts b/test/unit/arbitrary/array.spec.ts
index a267bb9e..e2ca2049 100644
--- a/test/unit/arbitrary/array.spec.ts
+++ b/test/unit/arbitrary/array.spec.ts
@@ -24,7 +24,7 @@ function beforeEachHook() {
 beforeEach(beforeEachHook);
 
 describe('array', () => {
-  it('should instantiate ArrayArbitrary(arb, 0, ?, ?) for array(arb)', () => {
+  it('should instantiate ArrayArbitrary(arb, 0, ?, 0x7fffffff) for array(arb)', () => {
     // Arrange
     const { instance: childInstance } = fakeNextArbitrary<unknown>();
     const { instance } = fakeNextArbitrary<unknown[]>();
@@ -35,13 +35,11 @@ describe('array', () => {
     const arb = array(convertFromNext(childInstance));
 
     // Assert
-    expect(ArrayArbitrary).toHaveBeenCalledWith(childInstance, 0, expect.any(Number), expect.any(Number));
+    expect(ArrayArbitrary).toHaveBeenCalledWith(childInstance, 0, expect.any(Number), 0x7fffffff);
     const receivedGeneratedMaxLength = ArrayArbitrary.mock.calls[0][2]; // Expecting the real value would check an implementation detail
     expect(receivedGeneratedMaxLength).toBeGreaterThan(0);
     expect(receivedGeneratedMaxLength).toBeLessThanOrEqual(2 ** 31 - 1);
     expect(Number.isInteger(receivedGeneratedMaxLength)).toBe(true);
-    const receivedMaxLength = ArrayArbitrary.mock.calls[0][3]; // Starting at v3, maxLength will be 0x7fffffff in such case
-    expect(receivedMaxLength).toBe(receivedGeneratedMaxLength);
     expect(convertToNext(arb)).toBe(instance);
   });
 
@@ -64,7 +62,7 @@ describe('array', () => {
     );
   });
 
-  it('should instantiate ArrayArbitrary(arb, minLength, ?, ?) for array(arb, {minLength})', () => {
+  it('should instantiate ArrayArbitrary(arb, minLength, ?, 0x7fffffff) for array(arb, {minLength})', () => {
     fc.assert(
       fc.property(fc.nat({ max: 2 ** 31 - 1 }), (minLength) => {
         // Arrange
@@ -77,7 +75,7 @@ describe('array', () => {
         const arb = array(convertFromNext(childInstance), { minLength });
 
         // Assert
-        expect(ArrayArbitrary).toHaveBeenCalledWith(childInstance, minLength, expect.any(Number), expect.any(Number));
+        expect(ArrayArbitrary).toHaveBeenCalledWith(childInstance, minLength, expect.any(Number), 0x7fffffff);
         const receivedGeneratedMaxLength = ArrayArbitrary.mock.calls[0][2]; // Expecting the real value would check an implementation detail
         if (minLength !== 2 ** 31 - 1) {
           expect(receivedGeneratedMaxLength).toBeGreaterThan(minLength);
@@ -86,8 +84,6 @@ describe('array', () => {
         } else {
           expect(receivedGeneratedMaxLength).toEqual(minLength);
         }
-        const receivedMaxLength = ArrayArbitrary.mock.calls[0][3]; // Starting at v3, maxLength will be 0x7fffffff in such case
-        expect(receivedMaxLength).toBe(receivedGeneratedMaxLength);
         expect(convertToNext(arb)).toBe(instance);
       })
     );
diff --git a/test/unit/arbitrary/base64String.spec.ts b/test/unit/arbitrary/base64String.spec.ts
index 852c6c3b..a6914e34 100644
--- a/test/unit/arbitrary/base64String.spec.ts
+++ b/test/unit/arbitrary/base64String.spec.ts
@@ -146,6 +146,21 @@ describe('base64String (integration)', () => {
   // assertShrinkProducesSameValueWithoutInitialContext is not applicable for base64String has some values will not shrink exactly the same way.
   // For instance: 'abcde' will be mapped to 'abcd', with default shrink it will try to shrink from 'abcde'. With context-less one it will start from 'abcd'.
 
+  it.each`
+    source                                                                    | constraints
+    ${'0123ABC==' /* invalid base 64 */}                                      | ${{}}
+    ${'AB==' /* not large enough */}                                          | ${{ minLength: 5 }}
+    ${'0123AB==' /* too large */}                                             | ${{ maxLength: 7 }}
+    ${'01230123012301230123AB==' /* TODO(size) - too large for the moment */} | ${{}}
+  `('should not be able to generate $source with fc.base64String($constraints)', ({ source, constraints }) => {
+    // Arrange / Act
+    const arb = convertToNext(base64String(constraints));
+    const out = arb.canShrinkWithoutContext(source);
+
+    // Assert
+    expect(out).toBe(false);
+  });
+
   it.each`
     rawValue
     ${'ABCD'}
diff --git a/test/unit/arbitrary/fullUnicodeString.spec.ts b/test/unit/arbitrary/fullUnicodeString.spec.ts
index 6ab126a8..d26af859 100644
--- a/test/unit/arbitrary/fullUnicodeString.spec.ts
+++ b/test/unit/arbitrary/fullUnicodeString.spec.ts
@@ -77,12 +77,13 @@ describe('fullUnicodeString (integration)', () => {
   });
 
   it.each`
-    source
-    ${'a\uD83Db' /* invalid string */}
-    ${'\u{1f431}\u{1f431}\u{1f431}\u{1f431}\u{1f431}\u{1f431}\u{1f431}\u{1f431}\u{1f431}\u{1f431}\u{1f431}' /* by default maxLength = maxLengthFromMinLength(0) = 10 */}
-  `('should not be able to generate $source with fc.fullUnicodeString()', ({ source }) => {
+    source                             | constraints
+    ${'a\uD83Db' /* invalid string */} | ${{}}
+    ${'ab' /* not large enough */}     | ${{ minLength: 3 }}
+    ${'abcd' /* too large */}          | ${{ maxLength: 3 }}
+  `('should not be able to generate $source with fc.fullUnicodeString($constraints)', ({ source, constraints }) => {
     // Arrange / Act
-    const arb = convertToNext(fullUnicodeString());
+    const arb = convertToNext(fullUnicodeString(constraints));
     const out = arb.canShrinkWithoutContext(source);
 
     // Assert
@@ -92,7 +93,8 @@ describe('fullUnicodeString (integration)', () => {
   it.each`
     rawValue
     ${'Hey \u{1f431}!'}
-  `('should be able to shrink $rawValue', ({ rawValue }) => {
+    ${'\u{1f431}'.repeat(50) /* longer than default maxGeneratedLength but ok for shrink */}
+  `('should be able to shrink $rawValue with fc.fullUnicodeString()', ({ rawValue }) => {
     // Arrange
     const arb = convertToNext(fullUnicodeString());
     const value = new NextValue(rawValue, undefined);
diff --git a/test/unit/arbitrary/set.spec.ts b/test/unit/arbitrary/set.spec.ts
index 65fe9861..298c8131 100644
--- a/test/unit/arbitrary/set.spec.ts
+++ b/test/unit/arbitrary/set.spec.ts
@@ -22,7 +22,7 @@ function beforeEachHook() {
 beforeEach(beforeEachHook);
 
 describe('set', () => {
-  it('should instantiate ArrayArbitrary(arb, 0, ?, ?, <default>) for set(arb)', () => {
+  it('should instantiate ArrayArbitrary(arb, 0, ?, 0x7fffffff, <default>) for set(arb)', () => {
     // Arrange
     const { instance: childInstance } = fakeNextArbitrary<unknown>();
     const { instance } = fakeNextArbitrary<unknown[]>();
@@ -33,19 +33,11 @@ describe('set', () => {
     const arb = set(convertFromNext(childInstance));
 
     // Assert
-    expect(ArrayArbitrary).toHaveBeenCalledWith(
-      childInstance,
-      0,
-      expect.any(Number),
-      expect.any(Number),
-      expect.any(Function)
-    );
+    expect(ArrayArbitrary).toHaveBeenCalledWith(childInstance, 0, expect.any(Number), 0x7fffffff, expect.any(Function));
     const receivedGeneratedMaxLength = ArrayArbitrary.mock.calls[0][2]; // Expecting the real value would check an implementation detail
     expect(receivedGeneratedMaxLength).toBeGreaterThan(0);
     expect(receivedGeneratedMaxLength).toBeLessThanOrEqual(2 ** 31 - 1);
     expect(Number.isInteger(receivedGeneratedMaxLength)).toBe(true);
-    const receivedMaxLength = ArrayArbitrary.mock.calls[0][3]; // Starting at v3, maxLength will be 0x7fffffff in such case
-    expect(receivedMaxLength).toBe(receivedGeneratedMaxLength);
     expect(convertToNext(arb)).toBe(instance);
   });
 
@@ -68,7 +60,7 @@ describe('set', () => {
     );
   });
 
-  it('should instantiate ArrayArbitrary(arb, minLength, ?, ? <default>) for set(arb, {minLength})', () => {
+  it('should instantiate ArrayArbitrary(arb, minLength, ?, 0x7fffffff <default>) for set(arb, {minLength})', () => {
     fc.assert(
       fc.property(fc.nat({ max: 2 ** 31 - 1 }), (minLength) => {
         // Arrange
@@ -86,7 +78,7 @@ describe('set', () => {
           childInstance,
           minLength,
           expect.any(Number),
-          expect.any(Number),
+          0x7fffffff,
           expect.any(Function)
         );
         const receivedGeneratedMaxLength = ArrayArbitrary.mock.calls[0][2]; // Expecting the real value would check an implementation detail
@@ -97,8 +89,6 @@ describe('set', () => {
         } else {
           expect(receivedGeneratedMaxLength).toEqual(minLength);
         }
-        const receivedMaxLength = ArrayArbitrary.mock.calls[0][3]; // Starting at v3, maxLength will be 0x7fffffff in such case
-        expect(receivedMaxLength).toBe(receivedGeneratedMaxLength);
         expect(convertToNext(arb)).toBe(instance);
       })
     );
@@ -175,7 +165,7 @@ describe('set', () => {
     );
   });
 
-  it('[legacy] should instantiate ArrayArbitrary(arb, 0, ?, ?, compare) for set(arb, compare)', () => {
+  it('[legacy] should instantiate ArrayArbitrary(arb, 0, ?, 0x7fffffff, compare) for set(arb, compare)', () => {
     fc.assert(
       fc.property(equalityCompare(), (compare) => {
         // Arrange
@@ -192,15 +182,13 @@ describe('set', () => {
           childInstance,
           0,
           expect.any(Number),
-          expect.any(Number),
+          0x7fffffff,
           expect.any(Function)
         );
         const receivedGeneratedMaxLength = ArrayArbitrary.mock.calls[0][2]; // Expecting the real value would check an implementation detail
         expect(receivedGeneratedMaxLength).toBeGreaterThan(0);
         expect(receivedGeneratedMaxLength).toBeLessThanOrEqual(2 ** 31 - 1);
         expect(Number.isInteger(receivedGeneratedMaxLength)).toBe(true);
-        const receivedMaxLength = ArrayArbitrary.mock.calls[0][3]; // Starting at v3, maxLength will be 0x7fffffff in such case
-        expect(receivedMaxLength).toBe(receivedGeneratedMaxLength);
         expect(convertToNext(arb)).toBe(instance);
       })
     );
diff --git a/test/unit/arbitrary/string.spec.ts b/test/unit/arbitrary/string.spec.ts
index 8ee52d11..d853e8ca 100644
--- a/test/unit/arbitrary/string.spec.ts
+++ b/test/unit/arbitrary/string.spec.ts
@@ -67,12 +67,13 @@ describe('string (integration)', () => {
   });
 
   it.each`
-    source
-    ${'01234567890' /* by default maxLength = maxLengthFromMinLength(0) = 10 */}
-    ${'a\u{1f431}b' /* out-of-range character */}
-  `('should not be able to generate $source with fc.string()', ({ source }) => {
+    source                                        | constraints
+    ${'a\u{1f431}b' /* out-of-range character */} | ${{}}
+    ${'ab' /* not large enough */}                | ${{ minLength: 3 }}
+    ${'abcd' /* too large */}                     | ${{ maxLength: 3 }}
+  `('should not be able to generate $source with fc.string($constraints)', ({ source, constraints }) => {
     // Arrange / Act
-    const arb = convertToNext(string());
+    const arb = convertToNext(string(constraints));
     const out = arb.canShrinkWithoutContext(source);
 
     // Assert
@@ -82,7 +83,8 @@ describe('string (integration)', () => {
   it.each`
     rawValue
     ${'Hey!'}
-  `('should be able to shrink $rawValue', ({ rawValue }) => {
+    ${'0'.repeat(50) /* longer than default maxGeneratedLength but ok for shrink */}
+  `('should be able to shrink $rawValue with fc.string()', ({ rawValue }) => {
     // Arrange
     const arb = convertToNext(string());
     const value = new NextValue(rawValue, undefined);
diff --git a/test/unit/arbitrary/stringOf.spec.ts b/test/unit/arbitrary/stringOf.spec.ts
index 4f0c719f..84a95932 100644
--- a/test/unit/arbitrary/stringOf.spec.ts
+++ b/test/unit/arbitrary/stringOf.spec.ts
@@ -44,6 +44,24 @@ describe('stringOf (integration)', () => {
   // Indeed depending how much the source strings overlaps there are possibly many possible ways to build a given string
   // so also many possible ways to shrink it.
 
+  it.each`
+    source                                                         | patterns        | constraints
+    ${'.__..' /* not from patterns */}                             | ${['..', '__']} | ${{}}
+    ${'__..' /* not large enough */}                               | ${['..', '__']} | ${{ minLength: 3 }}
+    ${'__..__..' /* too large */}                                  | ${['..', '__']} | ${{ maxLength: 3 }}
+    ${'..'.repeat(11) /* TODO(size) - too large for the moment */} | ${['..', '__']} | ${{}}
+  `(
+    'should not be able to generate $source with fc.stringOf(arb($patterns), $constraints)',
+    ({ source, patterns, constraints }) => {
+      // Arrange / Act
+      const arb = convertToNext(stringOf(convertFromNext(new PatternsArbitrary(patterns)), constraints));
+      const out = arb.canShrinkWithoutContext(source);
+
+      // Assert
+      expect(out).toBe(false);
+    }
+  );
+
   it.each`
     rawValue         | patterns
     ${'CccABbBbCcc'} | ${['A', 'Bb', 'Ccc']}