PatchCommandEncoder.java

1
/*******************************************************************************
2
 * Copyright (C) 2026, Leo Galambos
3
 * All rights reserved.
4
 * 
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions are met:
7
 * 
8
 * 1. Redistributions of source code must retain the above copyright notice,
9
 *    this list of conditions and the following disclaimer.
10
 * 
11
 * 2. Redistributions in binary form must reproduce the above copyright notice,
12
 *    this list of conditions and the following disclaimer in the documentation
13
 *    and/or other materials provided with the distribution.
14
 * 
15
 * 3. Neither the name of the copyright holder nor the names of its contributors
16
 *    may be used to endorse or promote products derived from this software
17
 *    without specific prior written permission.
18
 * 
19
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
 * POSSIBILITY OF SUCH DAMAGE.
30
 ******************************************************************************/
31
package org.egothor.stemmer;
32
33
import java.util.concurrent.locks.ReentrantLock;
34
35
/**
36
 * Encodes a compact patch command that transforms one word form into another
37
 * and applies such commands back to source words.
38
 *
39
 * <p>
40
 * The generated patch command follows the historical Egothor convention:
41
 * instructions are serialized so that they are applied from the end of the
42
 * source word toward its beginning. This keeps the command stream compact and
43
 * matches the behavior expected by existing stemming data.
44
 * </p>
45
 *
46
 * <p>
47
 * The encoder computes a minimum-cost edit script using weighted insert,
48
 * delete, replace, and match transitions. The resulting trace is then
49
 * serialized into the compact patch language.
50
 * </p>
51
 *
52
 * <p>
53
 * This class is stateful and reuses internal dynamic-programming matrices
54
 * across invocations to reduce allocation pressure during repeated use.
55
 * Instances are therefore not suitable for unsynchronized concurrent access.
56
 * The {@link #encode(String, String)} method is synchronized so that a shared
57
 * instance can still be used safely when needed.
58
 * </p>
59
 */
60
public final class PatchCommandEncoder {
61
62
    /**
63
     * Serialized opcode for deleting one or more characters.
64
     */
65
    private static final char DELETE_OPCODE = 'D';
66
67
    /**
68
     * Serialized opcode for inserting one character.
69
     */
70
    private static final char INSERT_OPCODE = 'I';
71
72
    /**
73
     * Serialized opcode for replacing one character.
74
     */
75
    private static final char REPLACE_OPCODE = 'R';
76
77
    /**
78
     * Serialized opcode for skipping one or more unchanged characters.
79
     */
80
    private static final char SKIP_OPCODE = '-';
81
82
    /**
83
     * Sentinel placed immediately before {@code 'a'} and used to accumulate compact
84
     * counts in the patch format.
85
     */
86
    private static final char COUNT_SENTINEL = (char) ('a' - 1);
87
88
    /**
89
     * Serialized opcode for a canonical no-operation patch.
90
     *
91
     * <p>
92
     * This opcode represents an identity transform of the whole source word. It is
93
     * used to ensure that equal source and target words always produce the same
94
     * serialized patch command.
95
     * </p>
96
     */
97
    private static final char NOOP_OPCODE = 'N';
98
99
    /**
100
     * Canonical argument used by the serialized no-operation patch.
101
     */
102
    private static final char NOOP_ARGUMENT = 'a';
103
104
    /**
105
     * Canonical serialized no-operation patch.
106
     *
107
     * <p>
108
     * This constant is returned by {@link #encode(String, String)} whenever source
109
     * and target are equal.
110
     * </p>
111
     */
112
    /* default */ static final String NOOP_PATCH = String.valueOf(new char[] { NOOP_OPCODE, NOOP_ARGUMENT });
113
114
    /**
115
     * Safety penalty used to prevent a mismatch from being selected as a match.
116
     */
117
    private static final int MISMATCH_PENALTY = 100;
118
119
    /**
120
     * Extra headroom added when internal matrices need to grow.
121
     */
122
    private static final int CAPACITY_MARGIN = 8;
123
124
    /**
125
     * Cost of inserting one character.
126
     */
127
    private final int insertCost;
128
129
    /**
130
     * Cost of deleting one character.
131
     */
132
    private final int deleteCost;
133
134
    /**
135
     * Cost of replacing one character.
136
     */
137
    private final int replaceCost;
138
139
    /**
140
     * Cost of keeping one matching character unchanged.
141
     */
142
    private final int matchCost;
143
144
    /**
145
     * Currently allocated source dimension of reusable matrices.
146
     */
147
    private int sourceCapacity;
148
149
    /**
150
     * Currently allocated target dimension of reusable matrices.
151
     */
152
    private int targetCapacity;
153
154
    /**
155
     * Dynamic-programming matrix containing cumulative minimum costs.
156
     */
157
    private int[][] costMatrix;
158
159
    /**
160
     * Matrix storing the chosen transition for each dynamic-programming cell.
161
     */
162
    private Trace[][] traceMatrix;
163
164
    /**
165
     * Reentrant lock for {@link #encode(String, String)} exclusive operation.
166
     */
167
    private final ReentrantLock lock = new ReentrantLock();
168
169
    /**
170
     * Internal dynamic-programming transition selected for one matrix cell.
171
     */
172
    private enum Trace {
173
174
        /**
175
         * Deletes one character from the source sequence.
176
         */
177
        DELETE,
178
179
        /**
180
         * Inserts one character from the target sequence.
181
         */
182
        INSERT,
183
184
        /**
185
         * Replaces one source character with one target character.
186
         */
187
        REPLACE,
188
189
        /**
190
         * Keeps one matching character unchanged.
191
         */
192
        MATCH
193
    }
194
195
    /**
196
     * Creates an encoder with the traditional Egothor cost model: insert = 1,
197
     * delete = 1, replace = 1, match = 0.
198
     */
199
    public PatchCommandEncoder() {
200
        this(1, 1, 1, 0);
201
    }
202
203
    /**
204
     * Creates an encoder with explicit operation costs.
205
     *
206
     * @param insertCost  cost of inserting one character
207
     * @param deleteCost  cost of deleting one character
208
     * @param replaceCost cost of replacing one character
209
     * @param matchCost   cost of keeping one equal character unchanged
210
     */
211
    public PatchCommandEncoder(int insertCost, int deleteCost, int replaceCost, int matchCost) {
212 2 1. <init> : changed conditional boundary → SURVIVED
2. <init> : negated conditional → KILLED
        if (insertCost < 0) {
213
            throw new IllegalArgumentException("insertCost must be non-negative.");
214
        }
215 2 1. <init> : changed conditional boundary → SURVIVED
2. <init> : negated conditional → KILLED
        if (deleteCost < 0) {
216
            throw new IllegalArgumentException("deleteCost must be non-negative.");
217
        }
218 2 1. <init> : changed conditional boundary → SURVIVED
2. <init> : negated conditional → KILLED
        if (replaceCost < 0) {
219
            throw new IllegalArgumentException("replaceCost must be non-negative.");
220
        }
221 2 1. <init> : changed conditional boundary → KILLED
2. <init> : negated conditional → KILLED
        if (matchCost < 0) {
222
            throw new IllegalArgumentException("matchCost must be non-negative.");
223
        }
224
225
        this.insertCost = insertCost;
226
        this.deleteCost = deleteCost;
227
        this.replaceCost = replaceCost;
228
        this.matchCost = matchCost;
229
        this.sourceCapacity = 0;
230
        this.targetCapacity = 0;
231
        this.costMatrix = new int[0][0];
232
        this.traceMatrix = new Trace[0][0];
233
    }
234
235
    /**
236
     * Produces a compact patch command that transforms {@code source} into
237
     * {@code target}.
238
     *
239
     * @param source source word form
240
     * @param target target word form
241
     * @return compact patch command, or {@code null} when any argument is
242
     *         {@code null}
243
     */
244
    public String encode(String source, String target) {
245 2 1. encode : negated conditional → KILLED
2. encode : negated conditional → KILLED
        if (source == null || target == null) {
246 1 1. encode : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::encode → KILLED
            return null;
247
        }
248
249 1 1. encode : negated conditional → KILLED
        if (source.equals(target)) {
250 1 1. encode : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::encode → KILLED
            return NOOP_PATCH;
251
        }
252
253
        int sourceLength = source.length();
254
        int targetLength = target.length();
255
256 1 1. encode : removed call to java/util/concurrent/locks/ReentrantLock::lock → KILLED
        lock.lock();
257
        try {
258 3 1. encode : removed call to org/egothor/stemmer/PatchCommandEncoder::ensureCapacity → KILLED
2. encode : Replaced integer addition with subtraction → KILLED
3. encode : Replaced integer addition with subtraction → KILLED
            ensureCapacity(sourceLength + 1, targetLength + 1);
259 1 1. encode : removed call to org/egothor/stemmer/PatchCommandEncoder::initializeBoundaryConditions → KILLED
            initializeBoundaryConditions(sourceLength, targetLength);
260
261
            char[] sourceCharacters = source.toCharArray();
262
            char[] targetCharacters = target.toCharArray();
263
264 1 1. encode : removed call to org/egothor/stemmer/PatchCommandEncoder::fillMatrices → KILLED
            fillMatrices(sourceCharacters, targetCharacters, sourceLength, targetLength);
265
266 1 1. encode : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::encode → KILLED
            return buildPatchCommand(targetCharacters, sourceLength, targetLength);
267
        } finally {
268 1 1. encode : removed call to java/util/concurrent/locks/ReentrantLock::unlock → SURVIVED
            lock.unlock();
269
        }
270
    }
271
272
    /**
273
     * Applies a compact patch command to the supplied source word.
274
     *
275
     * <p>
276
     * This method operates directly on serialized opcodes rather than mapping them
277
     * to another representation. That keeps the hot path small and avoids
278
     * unnecessary indirection during patch application.
279
     * </p>
280
     *
281
     * <p>
282
     * For compatibility with the historical behavior, malformed patch input that
283
     * causes index failures results in the original source word being returned
284
     * unchanged.
285
     * </p>
286
     *
287
     * @param source       original source word
288
     * @param patchCommand compact patch command
289
     * @return transformed word, or {@code null} when {@code source} is {@code null}
290
     */
291
    public static String apply(String source, String patchCommand) {
292 1 1. apply : negated conditional → KILLED
        if (source == null) {
293 1 1. apply : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED
            return null;
294
        }
295 2 1. apply : negated conditional → KILLED
2. apply : negated conditional → KILLED
        if (patchCommand == null || patchCommand.isEmpty()) {
296 1 1. apply : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED
            return source;
297
        }
298 1 1. apply : negated conditional → KILLED
        if (NOOP_PATCH.equals(patchCommand)) {
299 1 1. apply : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED
            return source;
300
        }
301
302
        StringBuilder result = new StringBuilder(source);
303
304 1 1. apply : negated conditional → KILLED
        if (result.isEmpty()) {
305 1 1. apply : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED
            return applyToEmptySource(result, patchCommand);
306
        }
307
308 1 1. apply : Replaced integer subtraction with addition → KILLED
        int position = result.length() - 1;
309
310
        try {
311 2 1. apply : changed conditional boundary → KILLED
2. apply : negated conditional → KILLED
            for (int patchIndex = 0, patchLength = patchCommand.length(); patchIndex < patchLength; patchIndex += 2) { // NOPMD
312
313
                char opcode = patchCommand.charAt(patchIndex);
314 1 1. apply : Replaced integer addition with subtraction → KILLED
                char argument = patchCommand.charAt(patchIndex + 1);
315 2 1. apply : Replaced integer subtraction with addition → KILLED
2. apply : Replaced integer addition with subtraction → KILLED
                int encodedCount = argument - 'a' + 1;
316
317
                switch (opcode) {
318
                    case SKIP_OPCODE:
319 2 1. apply : Replaced integer addition with subtraction → KILLED
2. apply : Replaced integer subtraction with addition → KILLED
                        position = position - encodedCount + 1;
320
                        break;
321
322
                    case REPLACE_OPCODE:
323 1 1. apply : removed call to java/lang/StringBuilder::setCharAt → KILLED
                        result.setCharAt(position, argument);
324
                        break;
325
326
                    case DELETE_OPCODE:
327 1 1. apply : Replaced integer addition with subtraction → KILLED
                        int deleteEndExclusive = position + 1;
328 2 1. apply : Replaced integer subtraction with addition → KILLED
2. apply : Replaced integer subtraction with addition → KILLED
                        position -= encodedCount - 1;
329
                        result.delete(position, deleteEndExclusive);
330
                        break;
331
332
                    case INSERT_OPCODE:
333 1 1. apply : Replaced integer addition with subtraction → KILLED
                        result.insert(position + 1, argument);
334 1 1. apply : Changed increment from 1 to -1 → KILLED
                        position++;
335
                        break;
336
337
                    case NOOP_OPCODE:
338 1 1. apply : negated conditional → KILLED
                        if (argument != NOOP_ARGUMENT) {
339
                            throw new IllegalArgumentException("Unsupported NOOP patch argument: " + argument);
340
                        }
341 1 1. apply : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → NO_COVERAGE
                        return source;
342
343
                    default:
344
                        throw new IllegalArgumentException("Unsupported patch opcode: " + opcode);
345
                }
346
347 1 1. apply : Changed increment from -1 to 1 → KILLED
                position--;
348
            }
349
        } catch (IndexOutOfBoundsException exception) {
350 1 1. apply : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED
            return source;
351
        }
352
353 1 1. apply : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED
        return result.toString();
354
    }
355
356
    /**
357
     * Applies a patch command to an empty source word.
358
     *
359
     * <p>
360
     * Only insertion instructions are meaningful for an empty source. Skip,
361
     * replace, and delete instructions are treated as malformed and therefore cause
362
     * the original source to be preserved, consistent with the historical fallback
363
     * behavior for index-invalid commands.
364
     * </p>
365
     *
366
     * @param result       empty result builder
367
     * @param patchCommand compact patch command
368
     * @return transformed word, or the original empty word when the patch is
369
     *         malformed
370
     */
371
    private static String applyToEmptySource(StringBuilder result, String patchCommand) {
372
        try {
373 2 1. applyToEmptySource : negated conditional → KILLED
2. applyToEmptySource : changed conditional boundary → KILLED
            for (int patchIndex = 0, patchLength = patchCommand.length(); patchIndex < patchLength; patchIndex += 2) { // NOPMD
374
375
                char opcode = patchCommand.charAt(patchIndex);
376 1 1. applyToEmptySource : Replaced integer addition with subtraction → KILLED
                char argument = patchCommand.charAt(patchIndex + 1);
377
378
                switch (opcode) {
379
                    case INSERT_OPCODE:
380
                        result.insert(0, argument);
381
                        break;
382
383
                    case SKIP_OPCODE:
384
                    case REPLACE_OPCODE:
385
                    case DELETE_OPCODE:
386
                        return "";
387
388
                    case NOOP_OPCODE:
389 1 1. applyToEmptySource : negated conditional → NO_COVERAGE
                        if (argument != NOOP_ARGUMENT) {
390
                            throw new IllegalArgumentException("Unsupported NOOP patch argument: " + argument);
391
                        }
392
                        return "";
393
394
                    default:
395
                        throw new IllegalArgumentException("Unsupported patch opcode: " + opcode);
396
                }
397
            }
398
        } catch (IndexOutOfBoundsException exception) {
399
            return "";
400
        }
401
402 1 1. applyToEmptySource : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::applyToEmptySource → KILLED
        return result.toString();
403
    }
404
405
    /**
406
     * Ensures that internal matrices are large enough for the requested input
407
     * dimensions.
408
     *
409
     * @param requiredSourceCapacity required source dimension
410
     * @param requiredTargetCapacity required target dimension
411
     */
412
    private void ensureCapacity(int requiredSourceCapacity, int requiredTargetCapacity) {
413 4 1. ensureCapacity : changed conditional boundary → SURVIVED
2. ensureCapacity : changed conditional boundary → SURVIVED
3. ensureCapacity : negated conditional → TIMED_OUT
4. ensureCapacity : negated conditional → TIMED_OUT
        if (requiredSourceCapacity <= sourceCapacity && requiredTargetCapacity <= targetCapacity) {
414
            return;
415
        }
416
417 1 1. ensureCapacity : Replaced integer addition with subtraction → KILLED
        sourceCapacity = Math.max(sourceCapacity, requiredSourceCapacity) + CAPACITY_MARGIN;
418 1 1. ensureCapacity : Replaced integer addition with subtraction → KILLED
        targetCapacity = Math.max(targetCapacity, requiredTargetCapacity) + CAPACITY_MARGIN;
419
420
        costMatrix = new int[sourceCapacity][targetCapacity];
421
        traceMatrix = new Trace[sourceCapacity][targetCapacity];
422
    }
423
424
    /**
425
     * Initializes the first row and first column of the dynamic-programming
426
     * matrices.
427
     *
428
     * @param sourceLength length of the source word
429
     * @param targetLength length of the target word
430
     */
431
    private void initializeBoundaryConditions(int sourceLength, int targetLength) {
432
        costMatrix[0][0] = 0;
433
        traceMatrix[0][0] = Trace.MATCH;
434
435 2 1. initializeBoundaryConditions : changed conditional boundary → KILLED
2. initializeBoundaryConditions : negated conditional → KILLED
        for (int sourceIndex = 1; sourceIndex <= sourceLength; sourceIndex++) {
436 1 1. initializeBoundaryConditions : Replaced integer multiplication with division → SURVIVED
            costMatrix[sourceIndex][0] = sourceIndex * deleteCost;
437
            traceMatrix[sourceIndex][0] = Trace.DELETE;
438
        }
439
440 2 1. initializeBoundaryConditions : negated conditional → KILLED
2. initializeBoundaryConditions : changed conditional boundary → KILLED
        for (int targetIndex = 1; targetIndex <= targetLength; targetIndex++) {
441 1 1. initializeBoundaryConditions : Replaced integer multiplication with division → SURVIVED
            costMatrix[0][targetIndex] = targetIndex * insertCost;
442
            traceMatrix[0][targetIndex] = Trace.INSERT;
443
        }
444
    }
445
446
    /**
447
     * Fills dynamic-programming matrices for the supplied source and target
448
     * character sequences.
449
     *
450
     * @param sourceCharacters source characters
451
     * @param targetCharacters target characters
452
     * @param sourceLength     source length
453
     * @param targetLength     target length
454
     */
455
    private void fillMatrices(char[] sourceCharacters, char[] targetCharacters, int sourceLength, int targetLength) {
456
457 2 1. fillMatrices : negated conditional → KILLED
2. fillMatrices : changed conditional boundary → KILLED
        for (int sourceIndex = 1; sourceIndex <= sourceLength; sourceIndex++) {
458 1 1. fillMatrices : Replaced integer subtraction with addition → KILLED
            char sourceCharacter = sourceCharacters[sourceIndex - 1];
459
460 2 1. fillMatrices : changed conditional boundary → KILLED
2. fillMatrices : negated conditional → KILLED
            for (int targetIndex = 1; targetIndex <= targetLength; targetIndex++) {
461 1 1. fillMatrices : Replaced integer subtraction with addition → KILLED
                char targetCharacter = targetCharacters[targetIndex - 1];
462
463 2 1. fillMatrices : Replaced integer addition with subtraction → KILLED
2. fillMatrices : Replaced integer subtraction with addition → KILLED
                int deleteCandidate = costMatrix[sourceIndex - 1][targetIndex] + deleteCost;
464 2 1. fillMatrices : Replaced integer addition with subtraction → KILLED
2. fillMatrices : Replaced integer subtraction with addition → KILLED
                int insertCandidate = costMatrix[sourceIndex][targetIndex - 1] + insertCost;
465 3 1. fillMatrices : Replaced integer subtraction with addition → KILLED
2. fillMatrices : Replaced integer addition with subtraction → KILLED
3. fillMatrices : Replaced integer subtraction with addition → KILLED
                int replaceCandidate = costMatrix[sourceIndex - 1][targetIndex - 1] + replaceCost;
466 2 1. fillMatrices : Replaced integer subtraction with addition → KILLED
2. fillMatrices : Replaced integer subtraction with addition → KILLED
                int matchCandidate = costMatrix[sourceIndex - 1][targetIndex - 1]
467 2 1. fillMatrices : Replaced integer addition with subtraction → KILLED
2. fillMatrices : negated conditional → KILLED
                        + (sourceCharacter == targetCharacter ? matchCost : MISMATCH_PENALTY);
468
469
                int bestCost = matchCandidate;
470
                Trace bestTrace = Trace.MATCH;
471
472 2 1. fillMatrices : changed conditional boundary → KILLED
2. fillMatrices : negated conditional → KILLED
                if (deleteCandidate <= bestCost) {
473
                    bestCost = deleteCandidate;
474
                    bestTrace = Trace.DELETE;
475
                }
476 2 1. fillMatrices : changed conditional boundary → SURVIVED
2. fillMatrices : negated conditional → KILLED
                if (insertCandidate < bestCost) {
477
                    bestCost = insertCandidate;
478
                    bestTrace = Trace.INSERT;
479
                }
480 2 1. fillMatrices : negated conditional → KILLED
2. fillMatrices : changed conditional boundary → KILLED
                if (replaceCandidate < bestCost) {
481
                    bestCost = replaceCandidate;
482
                    bestTrace = Trace.REPLACE;
483
                }
484
485
                costMatrix[sourceIndex][targetIndex] = bestCost;
486
                traceMatrix[sourceIndex][targetIndex] = bestTrace;
487
            }
488
        }
489
    }
490
491
    /**
492
     * Reconstructs the compact patch command by traversing the trace matrix from
493
     * the final cell back to the origin.
494
     *
495
     * @param targetCharacters target characters
496
     * @param sourceLength     source length
497
     * @param targetLength     target length
498
     * @return compact patch command
499
     */
500
    private String buildPatchCommand(char[] targetCharacters, int sourceLength, int targetLength) {
501
502 1 1. buildPatchCommand : Replaced integer addition with subtraction → KILLED
        StringBuilder patchBuilder = new StringBuilder(sourceLength + targetLength);
503
504
        char pendingDeletes = COUNT_SENTINEL;
505
        char pendingSkips = COUNT_SENTINEL;
506
507
        int sourceIndex = sourceLength;
508
        int targetIndex = targetLength;
509
510 2 1. buildPatchCommand : negated conditional → KILLED
2. buildPatchCommand : negated conditional → KILLED
        while (sourceIndex != 0 || targetIndex != 0) {
511
            Trace trace = traceMatrix[sourceIndex][targetIndex];
512
513
            switch (trace) {
514
                case DELETE:
515 1 1. buildPatchCommand : negated conditional → KILLED
                    if (pendingSkips != COUNT_SENTINEL) {
516 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED
                        appendInstruction(patchBuilder, SKIP_OPCODE, pendingSkips);
517
                        pendingSkips = COUNT_SENTINEL;
518
                    }
519 1 1. buildPatchCommand : Replaced integer addition with subtraction → KILLED
                    pendingDeletes++;
520 1 1. buildPatchCommand : Changed increment from -1 to 1 → KILLED
                    sourceIndex--;
521
                    break;
522
523
                case INSERT:
524 1 1. buildPatchCommand : negated conditional → KILLED
                    if (pendingDeletes != COUNT_SENTINEL) {
525 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → NO_COVERAGE
                        appendInstruction(patchBuilder, DELETE_OPCODE, pendingDeletes);
526
                        pendingDeletes = COUNT_SENTINEL;
527
                    }
528 1 1. buildPatchCommand : negated conditional → KILLED
                    if (pendingSkips != COUNT_SENTINEL) {
529 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED
                        appendInstruction(patchBuilder, SKIP_OPCODE, pendingSkips);
530
                        pendingSkips = COUNT_SENTINEL;
531
                    }
532 1 1. buildPatchCommand : Changed increment from -1 to 1 → KILLED
                    targetIndex--;
533 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED
                    appendInstruction(patchBuilder, INSERT_OPCODE, targetCharacters[targetIndex]);
534
                    break;
535
536
                case REPLACE:
537 1 1. buildPatchCommand : negated conditional → KILLED
                    if (pendingDeletes != COUNT_SENTINEL) {
538 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED
                        appendInstruction(patchBuilder, DELETE_OPCODE, pendingDeletes);
539
                        pendingDeletes = COUNT_SENTINEL;
540
                    }
541 1 1. buildPatchCommand : negated conditional → KILLED
                    if (pendingSkips != COUNT_SENTINEL) {
542 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED
                        appendInstruction(patchBuilder, SKIP_OPCODE, pendingSkips);
543
                        pendingSkips = COUNT_SENTINEL;
544
                    }
545 1 1. buildPatchCommand : Changed increment from -1 to 1 → KILLED
                    targetIndex--;
546 1 1. buildPatchCommand : Changed increment from -1 to 1 → KILLED
                    sourceIndex--;
547 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED
                    appendInstruction(patchBuilder, REPLACE_OPCODE, targetCharacters[targetIndex]);
548
                    break;
549
550
                case MATCH:
551 1 1. buildPatchCommand : negated conditional → KILLED
                    if (pendingDeletes != COUNT_SENTINEL) {
552 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED
                        appendInstruction(patchBuilder, DELETE_OPCODE, pendingDeletes);
553
                        pendingDeletes = COUNT_SENTINEL;
554
                    }
555 1 1. buildPatchCommand : Replaced integer addition with subtraction → KILLED
                    pendingSkips++;
556 1 1. buildPatchCommand : Changed increment from -1 to 1 → KILLED
                    sourceIndex--;
557 1 1. buildPatchCommand : Changed increment from -1 to 1 → KILLED
                    targetIndex--;
558
                    break;
559
            }
560
        }
561
562 1 1. buildPatchCommand : negated conditional → KILLED
        if (pendingDeletes != COUNT_SENTINEL) {
563 1 1. buildPatchCommand : removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED
            appendInstruction(patchBuilder, DELETE_OPCODE, pendingDeletes);
564
        }
565
566 1 1. buildPatchCommand : replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::buildPatchCommand → KILLED
        return patchBuilder.toString();
567
    }
568
569
    /**
570
     * Appends one serialized instruction to the patch command builder.
571
     *
572
     * @param patchBuilder patch command builder
573
     * @param opcode       single-character instruction opcode
574
     * @param argument     encoded instruction argument
575
     */
576
    private static void appendInstruction(StringBuilder patchBuilder, char opcode, char argument) {
577
        patchBuilder.append(opcode).append(argument);
578
    }
579
}

Mutations

212

1.1
Location : <init>
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

2.2
Location : <init>
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ConstructionTests]/[method:shouldRejectNegativeDeleteCost()]
negated conditional → KILLED

215

1.1
Location : <init>
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ConstructionTests]/[method:shouldRejectNegativeDeleteCost()]
negated conditional → KILLED

2.2
Location : <init>
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

218

1.1
Location : <init>
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

2.2
Location : <init>
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnNullWhenSourceIsNull()]
negated conditional → KILLED

221

1.1
Location : <init>
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnNullWhenSourceIsNull()]
changed conditional boundary → KILLED

2.2
Location : <init>
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnNullWhenSourceIsNull()]
negated conditional → KILLED

245

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnNullWhenSourceIsNull()]
negated conditional → KILLED

2.2
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnNullWhenTargetIsNull()]
negated conditional → KILLED

246

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnNullWhenSourceIsNull()]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::encode → KILLED

249

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnCanonicalNoopPatchForEqualWords()]
negated conditional → KILLED

250

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnCanonicalNoopPatchForEqualWords()]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::encode → KILLED

256

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
removed call to java/util/concurrent/locks/ReentrantLock::lock → KILLED

258

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
removed call to org/egothor/stemmer/PatchCommandEncoder::ensureCapacity → KILLED

2.2
Location : encode
Killed by : org.egothor.stemmer.StemmerPatchTrieLoaderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.StemmerPatchTrieLoaderTest]/[nested-class:BundledDictionaryTests]/[test-template:shouldPreserveAllStemCandidatesForBundledDictionaries(java.lang.String, org.egothor.stemmer.StemmerPatchTrieLoader$Language, org.egothor.stemmer.ReductionMode)]/[test-template-invocation:#4]
Replaced integer addition with subtraction → KILLED

3.3
Location : encode
Killed by : org.egothor.stemmer.StemmerPatchTrieLoaderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.StemmerPatchTrieLoaderTest]/[nested-class:BundledDictionaryTests]/[test-template:shouldPreserveAllStemCandidatesForBundledDictionaries(java.lang.String, org.egothor.stemmer.StemmerPatchTrieLoader$Language, org.egothor.stemmer.ReductionMode)]/[test-template-invocation:#4]
Replaced integer addition with subtraction → KILLED

259

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
removed call to org/egothor/stemmer/PatchCommandEncoder::initializeBoundaryConditions → KILLED

264

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
removed call to org/egothor/stemmer/PatchCommandEncoder::fillMatrices → KILLED

266

1.1
Location : encode
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::encode → KILLED

268

1.1
Location : encode
Killed by : none
removed call to java/util/concurrent/locks/ReentrantLock::unlock → SURVIVED
Covering tests

292

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[method:shouldReturnSourceWhenPatchIsNull()]
negated conditional → KILLED

293

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[method:shouldReturnNullWhenSourceIsNull()]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED

295

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[method:shouldReturnSourceWhenPatchIsNull()]
negated conditional → KILLED

2.2
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[method:shouldReturnSourceWhenPatchIsEmpty()]
negated conditional → KILLED

296

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[method:shouldReturnSourceWhenPatchIsNull()]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED

298

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
negated conditional → KILLED

299

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#10]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED

304

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
negated conditional → KILLED

305

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#8]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED

308

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Replaced integer subtraction with addition → KILLED

311

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
changed conditional boundary → KILLED

2.2
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
negated conditional → KILLED

314

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Replaced integer addition with subtraction → KILLED

315

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Replaced integer subtraction with addition → KILLED

2.2
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Replaced integer addition with subtraction → KILLED

319

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#4]
Replaced integer addition with subtraction → KILLED

2.2
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#4]
Replaced integer subtraction with addition → KILLED

323

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#3]
removed call to java/lang/StringBuilder::setCharAt → KILLED

327

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Replaced integer addition with subtraction → KILLED

328

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Replaced integer subtraction with addition → KILLED

2.2
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Replaced integer subtraction with addition → KILLED

333

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Replaced integer addition with subtraction → KILLED

334

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#19]
Changed increment from 1 to -1 → KILLED

338

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[method:shouldThrowForUnsupportedNoopArgument()]
negated conditional → KILLED

341

1.1
Location : apply
Killed by : none
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → NO_COVERAGE

347

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
Changed increment from -1 to 1 → KILLED

350

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldReturnOriginalSourceForMalformedOrIndexInvalidPatchCommands(int, java.lang.String, java.lang.String)]/[test-template-invocation:#3]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED

353

1.1
Location : apply
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#7]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::apply → KILLED

373

1.1
Location : applyToEmptySource
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#8]
negated conditional → KILLED

2.2
Location : applyToEmptySource
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#8]
changed conditional boundary → KILLED

376

1.1
Location : applyToEmptySource
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#8]
Replaced integer addition with subtraction → KILLED

389

1.1
Location : applyToEmptySource
Killed by : none
negated conditional → NO_COVERAGE

402

1.1
Location : applyToEmptySource
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ApplyTests]/[test-template:shouldApplyExplicitPatchCommandsCorrectly(int, java.lang.String, java.lang.String, java.lang.String)]/[test-template-invocation:#8]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::applyToEmptySource → KILLED

413

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

2.2
Location : ensureCapacity
Killed by : none
negated conditional → TIMED_OUT

3.3
Location : ensureCapacity
Killed by : none
changed conditional boundary → SURVIVED Covering tests

4.4
Location : ensureCapacity
Killed by : none
negated conditional → TIMED_OUT

417

1.1
Location : ensureCapacity
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
Replaced integer addition with subtraction → KILLED

418

1.1
Location : ensureCapacity
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
Replaced integer addition with subtraction → KILLED

435

1.1
Location : initializeBoundaryConditions
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
changed conditional boundary → KILLED

2.2
Location : initializeBoundaryConditions
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
negated conditional → KILLED

436

1.1
Location : initializeBoundaryConditions
Killed by : none
Replaced integer multiplication with division → SURVIVED
Covering tests

440

1.1
Location : initializeBoundaryConditions
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
negated conditional → KILLED

2.2
Location : initializeBoundaryConditions
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[test-template:shouldPreserveCorrectnessUnderMirroredInputOrientation(int, java.lang.String, java.lang.String)]/[test-template-invocation:#16]
changed conditional boundary → KILLED

441

1.1
Location : initializeBoundaryConditions
Killed by : none
Replaced integer multiplication with division → SURVIVED
Covering tests

457

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[test-template:shouldPreserveCorrectnessUnderMirroredInputOrientation(int, java.lang.String, java.lang.String)]/[test-template-invocation:#16]
negated conditional → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
changed conditional boundary → KILLED

458

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
Replaced integer subtraction with addition → KILLED

460

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
changed conditional boundary → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
negated conditional → KILLED

461

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
Replaced integer subtraction with addition → KILLED

463

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
Replaced integer addition with subtraction → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#2]
Replaced integer subtraction with addition → KILLED

464

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
Replaced integer addition with subtraction → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
Replaced integer subtraction with addition → KILLED

465

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
Replaced integer subtraction with addition → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
Replaced integer addition with subtraction → KILLED

3.3
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
Replaced integer subtraction with addition → KILLED

466

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
Replaced integer subtraction with addition → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
Replaced integer subtraction with addition → KILLED

467

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
Replaced integer addition with subtraction → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
negated conditional → KILLED

472

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#2]
changed conditional boundary → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
negated conditional → KILLED

476

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

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
negated conditional → KILLED

480

1.1
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#3]
negated conditional → KILLED

2.2
Location : fillMatrices
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#2]
changed conditional boundary → KILLED

502

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[test-template:shouldPreserveCorrectnessUnderMirroredInputOrientation(int, java.lang.String, java.lang.String)]/[test-template-invocation:#16]
Replaced integer addition with subtraction → KILLED

510

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
negated conditional → KILLED

2.2
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
negated conditional → KILLED

515

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#17]
negated conditional → KILLED

516

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#17]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

519

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
Replaced integer addition with subtraction → KILLED

520

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
Changed increment from -1 to 1 → KILLED

524

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[test-template:shouldPreserveCorrectnessUnderMirroredInputOrientation(int, java.lang.String, java.lang.String)]/[test-template-invocation:#17]
negated conditional → KILLED

525

1.1
Location : buildPatchCommand
Killed by : none
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → NO_COVERAGE

528

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[test-template:shouldPreserveCorrectnessUnderMirroredInputOrientation(int, java.lang.String, java.lang.String)]/[test-template-invocation:#17]
negated conditional → KILLED

529

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:ReversedWordProcessingTests]/[test-template:shouldReconstructReversedTargetsFromReversedSources(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

532

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[test-template:shouldPreserveCorrectnessUnderMirroredInputOrientation(int, java.lang.String, java.lang.String)]/[test-template-invocation:#17]
Changed increment from -1 to 1 → KILLED

533

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[test-template:shouldPreserveCorrectnessUnderMirroredInputOrientation(int, java.lang.String, java.lang.String)]/[test-template-invocation:#17]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

537

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.CompiledTrieArtifactRegressionTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.CompiledTrieArtifactRegressionTest]/[test-template:shouldMatchGoldenArtifactAndExpectedHash(org.egothor.stemmer.CompiledTrieArtifactRegressionTest$ArtifactCase)]/[test-template-invocation:#2]
negated conditional → KILLED

538

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandlePluralToSingularTransformation()]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

541

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#11]
negated conditional → KILLED

542

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#11]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

545

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#3]
Changed increment from -1 to 1 → KILLED

546

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#3]
Changed increment from -1 to 1 → KILLED

547

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#3]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

551

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#17]
negated conditional → KILLED

552

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

555

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#17]
Replaced integer addition with subtraction → KILLED

556

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
Changed increment from -1 to 1 → KILLED

557

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleDeletionHeavySuffixStripping()]
Changed increment from -1 to 1 → KILLED

562

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
negated conditional → KILLED

563

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

566

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[test-template:shouldReconstructTargetForRoundTripPairs(int, java.lang.String, java.lang.String)]/[test-template-invocation:#14]
replaced return value with "" for org/egothor/stemmer/PatchCommandEncoder::buildPatchCommand → KILLED

Active mutators

Tests examined


Report generated by PIT 1.22.1