Skip to content

documents.js mutation score sits at 68.77%, gated at 66 #1295

Description

@Mearman

packages/documents.js is gated at a mutation break threshold of 66, derived from a measured 68.77%: 13795 killed, 242 timeout, 4875 survived and 1500 no-coverage out of 20412 valid mutants. Every other codec in the workspace sits at 100, so this is the package keeping the repo off a uniform gate.

That leaves 6375 unkilled mutants over 135 source files, very unevenly spread. The worst twenty account for roughly 2937 of them, a little under half:

file survived no coverage total
src/layout/reconstruct.ts 290 41 331
src/svg/read.ts 236 43 279
src/mathml/layout.ts 229 49 278
src/hsqldb/script.ts 127 88 215
src/latex/lower.ts 167 34 201
src/edit/pptx/scaffold.ts 191 2 193
src/test-support/ods.ts 188 0 188
src/ooxml/docx/embedded-objects.ts 92 40 132
src/odf/odt/read.ts 95 15 110
src/svg/path.ts 95 15 110
src/layout/text-layout.ts 65 38 103
src/edit/docx/paragraph.ts 37 62 99
src/edit/pptx/shape.ts 52 44 96
src/layout/lattice.ts 87 8 95
src/odb/sql/evaluate.ts 61 30 91
src/hsqldb/binary-script.ts 60 26 86
src/edit/pptx/slide.ts 83 2 85
src/edit/odt/table.ts 40 43 83
src/latex/symbols.ts 82 1 83
src/layout/sheets.ts 75 4 79

Working down that list is the cheapest way to move the number, and each file can raise the threshold on its own once its own gaps close, so this does not have to land as one change.

The method that works here, established by the coverage already in the package, is to restructure the production code so the mutant cannot exist rather than to suppress it. A mutant that survives because two branches are genuinely equivalent gets killed by removing the equivalence, for example replacing an equivalent kind check with a property-presence guard, or resolving an entry by relationship target instead of by a positional index that a mutated offset cannot change the meaning of. What is not acceptable, and has not been used anywhere in this package, is a // Stryker disable comment, a weakened assertion, or a deleted one.

Two practical notes for whoever picks this up. The no-coverage column is worth reading separately from survived: a file like src/edit/docx/paragraph.ts is mostly missing tests outright (62 of its 99) while src/test-support/ods.ts is fully covered and simply not asserted hard enough (188 survived, 0 no-coverage), and those need different work. And CI will not measure this for you: the shard times out (#1298) and PR runs get cancelled before they start (#1294), so expect to measure locally at capped concurrency and treat CI as confirmation if it ever lands.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions