Files
werkcrappit/docs/features/03-complexity-and-identity.feature
miandmhoennig aea74c2c6f
werkator build succeeded after 00:34
Step 3 of 8: method inventory and reliable bytecode access (#4)
Step 3 of 8 from section 8.3 of the specification.

- Classes are read only from PIT's code roots (PIT's own code-path rule, never dependency JARs); differing copies are ambiguous, a missing class makes the scope incomplete.
- JaCoCo's analysis is matched against the methods the class file declares (ASM): methods JaCoCo filtered are EXCLUDED with proof (`jacoco-filtered:bridge|synthetic|generated-annotation|other`), abstract/native methods get no complexity.
- PIT's `excludedMethods` → EXCLUDED with `pit-excluded-method:<glob>`.
- Every method of the selected classes appears in the provisional report (schemaVersion 0) with a score or a reason.
- ADR 0002, feature 03, MC-008 to MC-012 mapped; MC-013 open.

CI on werkator.javagil.de: green (52 s), 66 unit and 8 functional tests.

PR-doc: `docs/prs/2026-10-01-PR#4-method-inventory.md`

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: mhoennig <michael@hoennig.de>
Reviewed-on: #4
2026-10-01 15:53:27 +02:00

59 lines
3.1 KiB
Gherkin

# language: de
Funktionalität: Komplexität und Mutanten derselben Methode verbinden
Als Entwickler möchte ich verlässliche Methodenwerte,
auch bei Überladungen oder fehlenden Quelltextinformationen.
@MC-008
Szenario: Komplexität ohne zusätzlichen Coverage-Lauf ermitteln
Angenommen ein Java-Fixture enthält eine Methode mit einer einfachen if-Verzweigung
Und die originale Class-Datei liegt vor
Und es gibt weder eine JaCoCo-exec-Datei noch einen für diese Auswertung aktiven JaCoCo-Agenten
Wenn das Plugin die Klasse statisch analysiert
Dann wird für diese Methode die JaCoCo-Gesamtkomplexität 2 ermittelt
Und dafür wird kein Test gestartet
Und es wird nicht versehentlich die abgedeckte Komplexität 0 verwendet
@MC-009
Szenario: Fehlende Debuginformationen verhindern den Join nicht
Angenommen dasselbe kleine Java-Fixture wird mit und ohne Debuginformationen kompiliert
Und für beide Varianten liegen passende Mutationsergebnisse vor
Wenn beide Varianten jeweils ausgewertet werden
Dann werden die Mutanten jeweils der korrekten JVM-Methode zugeordnet
Und die Methode hat in beiden Varianten dieselbe Gesamtkomplexität
Und fehlende Quelltextzeilen werden als nicht verfügbar dargestellt
@MC-010
Szenario: Überladene Methoden bleiben getrennt
Angenommen eine Klasse besitzt die Methoden "calculate(I)I" und "calculate(Ljava/lang/String;)I"
Und für beide Methoden liegen verschiedene Komplexitäten und Mutationsergebnisse vor
Wenn der Report erstellt wird
Dann enthält er zwei getrennte Methodenidentitäten
Und jede Methode verwendet nur ihre eigene Komplexität und ihre eigenen Mutanten
@MC-011
Szenario: Fehlender Originalbytecode wird nicht durch einen Fantasiewert ersetzt
Angenommen ein Mutationsergebnis verweist auf eine Methode
Und deren Originalklasse kann nicht zuverlässig gelesen werden
Wenn die Analyse abgeschlossen wird
Dann wird der betroffene Eintrag als "COMPLEXITY_UNAVAILABLE" ausgewiesen
Und kein Komplexitätswert wird aus Namen oder Mutantenzahl geschätzt
Und ein aktiviertes striktes Gate scheitert mit einem Analysefehler
@MC-012
Szenario: Eine Klasse ohne Ergebnis-Callback bleibt im Inventar sichtbar
Angenommen eine Produktionsklasse gehört zum ausdrücklich ausgewählten Analysescope
Und ihre ausführbaren Methoden können statisch analysiert werden
Und PIT liefert für diese Klasse keine Mutationsergebnisse
Wenn das Plugin den ausgewählten Scope vollständig inventarisiert
Dann erscheinen ihre Methoden mit Zustand "NO_MUTATION_RESULTS"
Und sie werden nicht als erfolgreich mutationsgetestet gezählt
@MC-013
Szenario: Reporting-Ausschlüsse verändern PIT nicht
Angenommen eine Methode ist durch eine ausdrückliche Reporting-Regel ausgeschlossen
Und PIT hat für diese Methode Mutationsergebnisse erzeugt
Wenn das Plugin den Report erstellt
Dann sind Ausschluss und angewendete Regel nachvollziehbar
Und diese Methode nimmt nicht am Score-Gate teil
Und die ursprünglichen PIT-Ergebnisse werden weder verändert noch entfernt