Skip to content

test(writer): kill behavioral VortexWriter survivors; parameterize dict-decision tests#101

Merged
dfa1 merged 1 commit into
mainfrom
pitest-vortexwriter-structural
Jun 20, 2026
Merged

test(writer): kill behavioral VortexWriter survivors; parameterize dict-decision tests#101
dfa1 merged 1 commit into
mainfrom
pitest-vortexwriter-structural

Conversation

@dfa1

@dfa1 dfa1 commented Jun 20, 2026

Copy link
Copy Markdown
Owner

Follow-up to #99/#100. Closes the remaining behavioral VortexWriter mutation survivors and tidies the dict-decision tests.

Kills

  • isUtf8DictCandidate cardinality-at-MAXseen.size() > MAX must not trip at exactly MAX (boundary).
  • rowCountForValidation on a Collection column — a two-column chunk (List<LocalDate> extension + same-length long[]) is accepted, pinning that the collection is measured by element count, not a constant.

Cleanup

VortexWriterDictDecisionTest is now @ParameterizedTest with proper Given/When/Then — the case params are the Given, result = helper(...) the When, the assertion the Then.

Remaining survivors (~30, not chased — by design)

Honest accounting: these are not correctness gaps:

  • Encoding-choice / round-trip-identical — dict-vs-fallback selection, the frequency List.sort, the zstd codec-list toggle: all produce different-but-valid files that decode to the same values.
  • 64-byte segment alignment math — a real Arrow contract, but self-consistent offsets still round-trip; killing needs internal segment-offset assertions.
  • Dead-by-exclusion — the I8/I16/F32 arms of the dict-build switches (those ptypes are excluded from dict by fix(writer): exclude I8/I16 from global dict — reader can't decode narrow-int dict #100).
  • Impractical — the U32 code path needs a 65k+-distinct dictionary.

VortexWriter sits at 89% killed (strength 92%); the global-dict decision layer and all behavioral paths are pinned.

Verify

./mvnw -pl writer -am -P pitest verify

🤖 Generated with Claude Code

…ct-decision tests

Two more genuinely-behavioral kills:
- isUtf8DictCandidate cardinality-at-MAX boundary (`seen.size() > MAX` must not
  trip at exactly MAX).
- rowCountForValidation on a Collection column: a two-column chunk (List<LocalDate>
  extension + same-length long[]) is accepted, pinning that the collection is
  measured by element count, not a constant.

Also restructure VortexWriterDictDecisionTest into @ParameterizedTest with proper
Given/When/Then: case params are the Given, `result = helper(...)` the When, the
assertion the Then.

VortexWriter 89% killed (strength 92%). The remaining survivors are encoding-choice
mutants that round-trip identically (dict-vs-fallback, frequency sort, zstd codec
list), 64-byte segment-alignment math, dead-by-exclusion ptype switch arms, or the
impractical U32 code path — not correctness gaps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dfa1 dfa1 merged commit 1b3ea20 into main Jun 20, 2026
6 checks passed
@dfa1 dfa1 deleted the pitest-vortexwriter-structural branch June 20, 2026 17:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant