Fix: assertCount will no longer cause a rewind error when given a generator (as per #2149) #2523
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.
Hi, first attempt at a pull request, attempting to tackle #2149!
The issue was found to be in two areas in Framework\Constraint\Count::getCountOf:
iterator_count()
attempted to rewind the generator object which fired off the error.iterator_count()
call exhausted it, the method would then attempt to rewind the generator object to set it back to the original position, also causing the error.The fix attempts to get around this by looping through the generator itself and counting up the times it was iterated. Non-generators are not affected by this change.
A new test was added to cover both a fresh generator and a generator which had been partially exhausted already.
The caveats from this are that the generator will always be fully exhausted as a result of the assertion, and that counting a partially exhausted generator will only be able to return the count from its current position to the end.
Feedback is appreciated!