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

Mutations

216

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:shouldReturnNullWhenTargetIsNull()]
negated conditional → KILLED

219

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

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

222

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:shouldReturnNullWhenTargetIsNull()]
negated conditional → KILLED

225

1.1
Location : <init>
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:EncodeTests]/[method:shouldReturnNullWhenTargetIsNull()]
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:shouldReturnNullWhenTargetIsNull()]
negated conditional → KILLED

249

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

250

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

253

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

254

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

260

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

262

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

263

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

268

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

270

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

272

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

296

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

297

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

299

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

300

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

302

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

303

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

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]
negated conditional → KILLED

309

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

312

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

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]
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

318

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

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:#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

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:#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

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:#3]
removed call to java/lang/StringBuilder::setCharAt → KILLED

331

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

332

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

337

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

338

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

342

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

345

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

351

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

354

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

357

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

377

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

380

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

393

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

406

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

417

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

421

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

422

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

439

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

440

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

444

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

445

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

461

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

462

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

464

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

465

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

467

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

468

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

469

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

470

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

471

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

476

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

480

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

484

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

506

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

514

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

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:#17]
negated conditional → 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:#17]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

523

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

524

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

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 : none
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → NO_COVERAGE

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]
negated conditional → KILLED

533

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

536

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

537

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

541

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

542

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

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:#11]
negated conditional → 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:#11]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

549

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

550

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

551

1.1
Location : buildPatchCommand
Killed by : org.egothor.stemmer.PatchCommandEncoderTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.PatchCommandEncoderTest]/[nested-class:StemmingScenarioTests]/[method:shouldHandleSingleCharacterReplacement()]
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]
negated conditional → 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()]
removed call to org/egothor/stemmer/PatchCommandEncoder::appendInstruction → KILLED

559

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

560

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

561

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

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]
negated conditional → KILLED

567

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

570

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