GitHubAnnotationsEmitter.java

1
package org.egothor.methodatlas.emit;
2
3
import java.io.PrintWriter;
4
import java.util.List;
5
6
import org.egothor.methodatlas.TagAiDrift;
7
import org.egothor.methodatlas.TestMethodSink;
8
import org.egothor.methodatlas.ai.AiMethodSuggestion;
9
10
/**
11
 * Emits GitHub Actions workflow commands for inline PR annotations.
12
 *
13
 * <p>Only security-relevant methods produce output. Each method becomes one
14
 * {@code ::notice} or {@code ::warning} line that GitHub Actions intercepts
15
 * and renders as an inline annotation on the PR diff:</p>
16
 *
17
 * <ul>
18
 *   <li>{@code ::warning} — when {@code ai_interaction_score >= 0.8}: the test
19
 *       only verifies that methods were called, not what they returned.</li>
20
 *   <li>{@code ::notice} — otherwise: a well-formed security test worth
21
 *       reviewing.</li>
22
 * </ul>
23
 *
24
 * <p>The file path in each annotation is constructed as
25
 * {@code <filePrefix><fqcn-as-path>.java}, where {@code filePrefix} is
26
 * derived from the first configured scan root (e.g. {@code src/test/java/}).
27
 * This produces paths like {@code src/test/java/com/acme/AuthTest.java},
28
 * which GitHub resolves to the correct inline position in the PR diff for
29
 * standard Maven / Gradle source layouts.</p>
30
 *
31
 * <p>This mode does not require a GitHub Advanced Security licence, unlike
32
 * SARIF upload via the {@code upload-sarif} action.</p>
33
 *
34
 * @see TestMethodSink
35
 */
36
public final class GitHubAnnotationsEmitter implements TestMethodSink {
37
38
    /** Interaction score at or above which a security test is flagged as a potential placebo. */
39
    public static final double PLACEBO_THRESHOLD = 0.8;
40
41
    private final PrintWriter out;
42
    private final String filePrefix;
43
44
    /**
45
     * @param out        writer that receives the annotation lines
46
     * @param filePrefix prefix prepended to the FQCN-derived file path,
47
     *                   including a trailing slash (e.g. {@code "src/test/java/"});
48
     *                   empty string when the scan root is already the repo root
49
     */
50
    public GitHubAnnotationsEmitter(PrintWriter out, String filePrefix) {
51
        this.out = out;
52
        this.filePrefix = filePrefix;
53
    }
54
55
    @Override
56
    @SuppressWarnings("PMD.UseObjectForClearerAPI")
57
    public void record(String fqcn, String method, int beginLine, int loc, String contentHash,
58
            List<String> tags, String displayName, AiMethodSuggestion suggestion) {
59
        String filePath = filePrefix + fqcn.replace('.', '/') + ".java";
60
61 4 1. record : removed conditional - replaced equality check with true → SURVIVED
2. record : removed conditional - replaced equality check with false → KILLED
3. record : removed conditional - replaced equality check with true → KILLED
4. record : removed conditional - replaced equality check with false → KILLED
        if (displayName != null && displayName.isEmpty()) {
62 1 1. record : removed call to java/io/PrintWriter::println → KILLED
            out.println(formatCommand("notice", filePath, beginLine,
63
                    "@DisplayName(\"\") on " + fqcn + "#" + method,
64
                    "@DisplayName(\"\") declares an empty display name — "
65
                            + "the test will appear unnamed in reports, obscuring the audit trail. "
66
                            + "Replace with a meaningful description, "
67
                            + "e.g. @DisplayName(\"Verifies that ...\")."));
68
        }
69
70 4 1. record : removed conditional - replaced equality check with true → KILLED
2. record : removed conditional - replaced equality check with false → KILLED
3. record : removed conditional - replaced equality check with true → KILLED
4. record : removed conditional - replaced equality check with false → KILLED
        if (suggestion == null || !suggestion.securityRelevant()) {
71
            return;
72
        }
73
74 3 1. record : removed conditional - replaced comparison check with true → KILLED
2. record : changed conditional boundary → KILLED
3. record : removed conditional - replaced comparison check with false → KILLED
        boolean isPlacebo = suggestion.interactionScore() >= PLACEBO_THRESHOLD;
75 2 1. record : removed conditional - replaced equality check with false → KILLED
2. record : removed conditional - replaced equality check with true → KILLED
        String level = isPlacebo ? "warning" : "notice";
76
77 4 1. record : removed conditional - replaced equality check with true → KILLED
2. record : removed conditional - replaced equality check with false → KILLED
3. record : removed conditional - replaced equality check with false → KILLED
4. record : removed conditional - replaced equality check with true → KILLED
        String title = suggestion.displayName() != null && !suggestion.displayName().isBlank()
78
                ? suggestion.displayName()
79
                : fqcn + "#" + method;
80
81
        TagAiDrift drift = TagAiDrift.compute(tags, suggestion);
82
        String message = buildMessage(suggestion, isPlacebo, drift);
83
84 1 1. record : removed call to java/io/PrintWriter::println → KILLED
        out.println(formatCommand(level, filePath, beginLine, title, message));
85
    }
86
87
    @SuppressWarnings("PMD.NPathComplexity")
88
    private static String buildMessage(AiMethodSuggestion suggestion, boolean isPlacebo, TagAiDrift drift) {
89
        StringBuilder sb = new StringBuilder(512);
90
91 4 1. buildMessage : removed conditional - replaced equality check with true → SURVIVED
2. buildMessage : removed conditional - replaced equality check with false → SURVIVED
3. buildMessage : removed conditional - replaced equality check with false → SURVIVED
4. buildMessage : removed conditional - replaced equality check with true → KILLED
        if (suggestion.displayName() != null && !suggestion.displayName().isBlank()) {
92
            sb.append("Suggested @DisplayName: \"").append(suggestion.displayName()).append('"');
93
        }
94 2 1. buildMessage : removed conditional - replaced equality check with false → KILLED
2. buildMessage : removed conditional - replaced equality check with true → KILLED
        if (!suggestion.tags().isEmpty()) {
95 1 1. buildMessage : removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → SURVIVED
            appendSep(sb);
96
            sb.append("Suggested @Tag: ").append(String.join(", ", suggestion.tags()));
97
        }
98 4 1. buildMessage : removed conditional - replaced equality check with false → NO_COVERAGE
2. buildMessage : removed conditional - replaced equality check with false → SURVIVED
3. buildMessage : removed conditional - replaced equality check with true → NO_COVERAGE
4. buildMessage : removed conditional - replaced equality check with true → KILLED
        if (suggestion.reason() != null && !suggestion.reason().isBlank()) {
99 1 1. buildMessage : removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → NO_COVERAGE
            appendSep(sb);
100
            String reason = suggestion.reason().strip();
101
            sb.append("Reason: ").append(reason);
102 2 1. buildMessage : removed conditional - replaced equality check with true → NO_COVERAGE
2. buildMessage : removed conditional - replaced equality check with false → NO_COVERAGE
            if (!reason.endsWith(".")) {
103
                sb.append('.');
104
            }
105
        }
106 2 1. buildMessage : removed conditional - replaced equality check with false → KILLED
2. buildMessage : removed conditional - replaced equality check with true → KILLED
        if (isPlacebo) {
107 1 1. buildMessage : removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → SURVIVED
            appendSep(sb);
108
            sb.append("Interaction score ")
109
              .append(String.format("%.1f", suggestion.interactionScore()))
110
              .append(": assertions only verify method calls, not output values or state");
111
        }
112 2 1. buildMessage : removed conditional - replaced equality check with false → SURVIVED
2. buildMessage : removed conditional - replaced equality check with true → KILLED
        if (drift == TagAiDrift.TAG_ONLY) {
113 1 1. buildMessage : removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → NO_COVERAGE
            appendSep(sb);
114
            sb.append("Drift: @Tag(\"security\") present but AI disagrees — annotation may be stale");
115 2 1. buildMessage : removed conditional - replaced equality check with true → KILLED
2. buildMessage : removed conditional - replaced equality check with false → KILLED
        } else if (drift == TagAiDrift.AI_ONLY) {
116 1 1. buildMessage : removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → SURVIVED
            appendSep(sb);
117
            sb.append("Drift: AI classifies as security-relevant but no @Tag(\"security\") in source");
118
        }
119 2 1. buildMessage : removed conditional - replaced equality check with true → SURVIVED
2. buildMessage : removed conditional - replaced equality check with false → KILLED
        if (sb.length() == 0) {
120
            sb.append("Security test");
121
        }
122 1 1. buildMessage : replaced return value with "" for org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::buildMessage → KILLED
        return sb.toString();
123
    }
124
125
    private static void appendSep(StringBuilder sb) {
126 3 1. appendSep : changed conditional boundary → SURVIVED
2. appendSep : removed conditional - replaced comparison check with false → SURVIVED
3. appendSep : removed conditional - replaced comparison check with true → SURVIVED
        if (sb.length() > 0) {
127
            sb.append(" · ");
128
        }
129
    }
130
131
    /**
132
     * Formats a GitHub Actions workflow command line.
133
     */
134
    @SuppressWarnings("PMD.UseObjectForClearerAPI")
135
    public static String formatCommand(String level, String filePath, int beginLine,
136
            String title, String message) {
137
        StringBuilder cmd = new StringBuilder(128);
138
        cmd.append("::").append(level).append(" file=").append(escapeParam(filePath));
139 3 1. formatCommand : removed conditional - replaced comparison check with true → KILLED
2. formatCommand : changed conditional boundary → KILLED
3. formatCommand : removed conditional - replaced comparison check with false → KILLED
        if (beginLine > 0) {
140
            cmd.append(",line=").append(beginLine);
141
        }
142 4 1. formatCommand : removed conditional - replaced equality check with true → KILLED
2. formatCommand : removed conditional - replaced equality check with false → KILLED
3. formatCommand : removed conditional - replaced equality check with true → KILLED
4. formatCommand : removed conditional - replaced equality check with false → KILLED
        if (title != null && !title.isEmpty()) {
143
            cmd.append(",title=").append(escapeParam(title));
144
        }
145
        cmd.append("::").append(escapeMessage(message));
146 1 1. formatCommand : replaced return value with "" for org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::formatCommand → KILLED
        return cmd.toString();
147
    }
148
149
    /**
150
     * Encodes characters that would break a GitHub workflow command parameter value.
151
     */
152
    public static String escapeParam(String value) {
153 1 1. escapeParam : replaced return value with "" for org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::escapeParam → KILLED
        return value
154
                .replace("%", "%25")
155
                .replace("\r", "%0D")
156
                .replace("\n", "%0A")
157
                .replace(":", "%3A")
158
                .replace(",", "%2C");
159
    }
160
161
    /**
162
     * Encodes characters that would break a GitHub workflow command message.
163
     */
164
    public static String escapeMessage(String value) {
165 1 1. escapeMessage : replaced return value with "" for org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::escapeMessage → KILLED
        return value
166
                .replace("%", "%25")
167
                .replace("\r", "%0D")
168
                .replace("\n", "%0A");
169
    }
170
}

Mutations

61

1.1
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_emptyDisplayName_titleContainsFqcnAndMethod()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_nullDisplayName_noExtraAnnotation()]
removed conditional - replaced equality check with true → KILLED

3.3
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_emptyDisplayName_titleContainsFqcnAndMethod()]
removed conditional - replaced equality check with false → KILLED

4.4
Location : record
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

62

1.1
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_emptyDisplayName_titleContainsFqcnAndMethod()]
removed call to java/io/PrintWriter::println → KILLED

70

1.1
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with true → KILLED

2.2
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_tagOnlyDrift_producesNoOutput()]
removed conditional - replaced equality check with false → KILLED

3.3
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_nullDisplayName_noExtraAnnotation()]
removed conditional - replaced equality check with true → KILLED

4.4
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with false → KILLED

74

1.1
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced comparison check with true → KILLED

2.2
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_interactionScoreAtThreshold_emitsWarning()]
changed conditional boundary → KILLED

3.3
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_placeboMessageIncludesInteractionScore()]
removed conditional - replaced comparison check with false → KILLED

75

1.1
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_interactionScoreAboveThreshold_emitsWarning()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_interactionScoreBelowThreshold_emitsNotice()]
removed conditional - replaced equality check with true → KILLED

77

1.1
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with true → KILLED

2.2
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_displayNameUsedAsTitle()]
removed conditional - replaced equality check with false → KILLED

3.3
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_displayNameUsedAsTitle()]
removed conditional - replaced equality check with false → KILLED

4.4
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_blankDisplayNameInSuggestion_titleFallsBackToFqcnMethod()]
removed conditional - replaced equality check with true → KILLED

84

1.1
Location : record
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed call to java/io/PrintWriter::println → KILLED

91

1.1
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

2.2
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with true → KILLED

3.3
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with false → SURVIVED Covering tests

4.4
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with false → SURVIVED Covering tests

94

1.1
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_tagsIncludedInMessage()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with true → KILLED

95

1.1
Location : buildMessage
Killed by : none
removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → SURVIVED
Covering tests

98

1.1
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

2.2
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with false → SURVIVED
Covering tests

3.3
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with true → KILLED

4.4
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

99

1.1
Location : buildMessage
Killed by : none
removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → NO_COVERAGE

102

1.1
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with true → NO_COVERAGE

2.2
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with false → NO_COVERAGE

106

1.1
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_placeboMessageIncludesInteractionScore()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with true → KILLED

107

1.1
Location : buildMessage
Killed by : none
removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → SURVIVED
Covering tests

112

1.1
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with false → SURVIVED
Covering tests

2.2
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with true → KILLED

113

1.1
Location : buildMessage
Killed by : none
removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → NO_COVERAGE

115

1.1
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with true → KILLED

2.2
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_emptyTagsAndNonPlacebo_noSourceTag_messageIsAiOnlyDrift()]
removed conditional - replaced equality check with false → KILLED

116

1.1
Location : buildMessage
Killed by : none
removed call to org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::appendSep → SURVIVED
Covering tests

119

1.1
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
removed conditional - replaced equality check with false → KILLED

2.2
Location : buildMessage
Killed by : none
removed conditional - replaced equality check with true → SURVIVED
Covering tests

122

1.1
Location : buildMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:record_allOptionalFieldsAbsent_messageIsSecurityTestFallback()]
replaced return value with "" for org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::buildMessage → KILLED

126

1.1
Location : appendSep
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

2.2
Location : appendSep
Killed by : none
removed conditional - replaced comparison check with false → SURVIVED Covering tests

3.3
Location : appendSep
Killed by : none
removed conditional - replaced comparison check with true → SURVIVED Covering tests

139

1.1
Location : formatCommand
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:formatCommand_lineZeroOmitted()]
removed conditional - replaced comparison check with true → KILLED

2.2
Location : formatCommand
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:formatCommand_lineZeroOmitted()]
changed conditional boundary → KILLED

3.3
Location : formatCommand
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:formatCommand_includesFileAndLine()]
removed conditional - replaced comparison check with false → KILLED

142

1.1
Location : formatCommand
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:formatCommand_emptyTitleOmitted()]
removed conditional - replaced equality check with true → KILLED

2.2
Location : formatCommand
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:formatCommand_titleIsEscaped()]
removed conditional - replaced equality check with false → KILLED

3.3
Location : formatCommand
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:formatCommand_nullTitleOmitted()]
removed conditional - replaced equality check with true → KILLED

4.4
Location : formatCommand
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:formatCommand_titleIsEscaped()]
removed conditional - replaced equality check with false → KILLED

146

1.1
Location : formatCommand
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:formatCommand_warningLevelProducesCorrectPrefix()]
replaced return value with "" for org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::formatCommand → KILLED

153

1.1
Location : escapeParam
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:escapeParam_encodesComma()]
replaced return value with "" for org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::escapeParam → KILLED

165

1.1
Location : escapeMessage
Killed by : org.egothor.methodatlas.GitHubAnnotationsEmitterTest.[engine:junit-jupiter]/[class:org.egothor.methodatlas.GitHubAnnotationsEmitterTest]/[method:escapeMessage_encodesNewline()]
replaced return value with "" for org/egothor/methodatlas/emit/GitHubAnnotationsEmitter::escapeMessage → KILLED

Active mutators

Tests examined


Report generated by PIT 1.22.1