Connect filter to rejection mechanisms like fc.pre does
#6185
+65
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
The
filtermethod on arbitraries could loop indefinitely when the filter predicate was too restrictive, whilefc.prehad a proper rejection mechanism that would fail fast and be handled by the property testing framework.Consider this example that would hang indefinitely before this fix:
In contrast,
fc.prehandles impossible conditions gracefully:Solution
Modified
FilterArbitrary.generate()to count failed filter attempts and throwPreconditionFailureafter 100 attempts (aligning with the framework's defaultmaxSkipsPerRunof 100). This connectsfilterto the same rejection mechanism thatfc.preuses.The key changes in
packages/fast-check/src/check/arbitrary/definition/Arbitrary.ts:Benefits
fc.prewhen conditions are impossible to satisfyPreconditionFailure) that the framework already handles properlyTesting
Added comprehensive tests demonstrating that:
filterandfc.prefor rejection scenariosAll existing tests continue to pass, ensuring no regressions were introduced.
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.