CompiledNode.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.trie;
32
33
import java.util.Arrays;
34
import java.util.Objects;
35
36
/**
37
 * Logically immutable compiled trie node optimized for read access.
38
 *
39
 * <p>
40
 * The returned arrays are the internal backing storage of the compiled node.
41
 * They are exposed for efficient access by closely related trie infrastructure
42
 * and therefore must never be modified by callers. Construction transfers
43
 * read-only ownership of the supplied arrays to this node; retaining and
44
 * changing an array after construction violates the API contract.
45
 * </p>
46
 *
47
 * <p>
48
 * Subject to that ownership contract, instances are immutable and safe for
49
 * concurrent reads. An accepting node may have child edges: legacy first-match
50
 * lookup stops at that node, while most-specific lookup may continue into its
51
 * children.
52
 * </p>
53
 *
54
 * @param <V> value type
55
 */
56
public final class CompiledNode<V> {
57
58
    /**
59
     * Default dense child lookup span in characters used when an explicit override
60
     * is not provided.
61
     */
62
    public static final int DEFAULT_MAX_EXPANDED_INDEX = 512;
63
64
    /**
65
     * Number of child edges where linear scan is cheaper than binary search.
66
     */
67
    private static final int LINEAR_CHILD_COUNT_THRESHOLD = 4;
68
69
    /**
70
     * Edge labels in sorted ascending order.
71
     */
72
    private final char[] edgeLabels;
73
74
    /**
75
     * Sparse child array aligned with {@link #edgeLabels}.
76
     */
77
    private final CompiledNode<V>[] children;
78
79
    /**
80
     * Dense child lookup table used when labels fit into a compact char interval.
81
     * <p>
82
     * The table enables direct O(1) indexing for child lookup and is allocated only
83
     * when the character span of this node's edges is within the configured
84
     * threshold.
85
     * </p>
86
     */
87
    private final CompiledNode<V>[] denseChildren;
88
89
    /**
90
     * Normalized minimum edge value for the dense lookup table.
91
     */
92
    private final int denseEdgeMin;
93
94
    /**
95
     * Values stored at this node in local order.
96
     */
97
    private final V[] orderedValues;
98
99
    /**
100
     * Occurrence counts aligned with {@link #orderedValues}.
101
     */
102
    private final int[] orderedCounts;
103
104
    /**
105
     * Whether this node accepts any remaining lookup input.
106
     */
107
    private final boolean acceptsRemainingInput;
108
109
    /**
110
     * Creates one validated compiled node using {@link #DEFAULT_MAX_EXPANDED_INDEX}
111
     * for dense lookup sizing.
112
     *
113
     * @param edgeLabels    strictly ascending transition labels; retained directly
114
     * @param children      child nodes aligned with {@code edgeLabels}; retained
115
     *                      directly
116
     * @param orderedValues values in deterministic preference order; retained
117
     *                      directly
118
     * @param orderedCounts positive occurrence counts aligned with
119
     *                      {@code orderedValues}; retained directly
120
     * @throws NullPointerException     if an array, child, or value is {@code null}
121
     * @throws IllegalArgumentException if the edge-related arrays or value-related
122
     *                                  arrays do not have matching lengths, labels
123
     *                                  are not strictly ascending, or a count is not
124
     *                                  positive
125
     */
126
    public CompiledNode(final char[] edgeLabels, final CompiledNode<V>[] children, final V[] orderedValues,
127
            final int... orderedCounts) {
128
        this(edgeLabels, children, orderedValues, DEFAULT_MAX_EXPANDED_INDEX, orderedCounts);
129
    }
130
131
    /**
132
     * Creates one validated compiled node.
133
     *
134
     * @param edgeLabels      strictly ascending transition labels; retained directly
135
     * @param children        child nodes aligned with {@code edgeLabels}; retained
136
     *                        directly
137
     * @param orderedValues   values in deterministic preference order; retained
138
     *                        directly
139
     * @param maxExpandedIndex upper bound for the dense lookup interval size; zero
140
     *                         disables dense lookup. Larger values improve
141
     *                         direct-index likelihood while increasing dense table
142
     *                         memory in compact-label nodes.
143
     * @param orderedCounts   positive occurrence counts aligned with
144
     *                        {@code orderedValues}; retained directly
145
     * @throws NullPointerException     if an array, child, or value is {@code null}
146
     * @throws IllegalArgumentException if the edge-related arrays or value-related
147
     *                                  arrays do not have matching lengths or the
148
     *                                  dense interval size is negative; if labels are
149
     *                                  not strictly ascending; or if a count is not
150
     *                                  positive
151
     */
152
    public CompiledNode(final char[] edgeLabels, final CompiledNode<V>[] children, final V[] orderedValues,
153
            final int maxExpandedIndex, final int... orderedCounts) {
154
        this(edgeLabels, children, orderedValues, false, maxExpandedIndex, orderedCounts);
155
    }
156
157
    /**
158
     * Creates one validated compiled node.
159
     *
160
     * @param edgeLabels            strictly ascending transition labels; retained
161
     *                              directly
162
     * @param children              child nodes aligned with {@code edgeLabels};
163
     *                              retained directly
164
     * @param orderedValues         values in deterministic preference order;
165
     *                              retained directly
166
     * @param acceptsRemainingInput whether this node accepts any remaining lookup
167
     *                              input
168
     * @param maxExpandedIndex      upper bound for the dense lookup interval size
169
     * @param orderedCounts         positive occurrence counts aligned with
170
     *                              {@code orderedValues}; retained directly
171
     * @throws NullPointerException     if an array, child, or value is {@code null}
172
     * @throws IllegalArgumentException if the edge-related arrays or value-related
173
     *                                  arrays do not have matching lengths, the
174
     *                                  dense interval size is negative, labels are
175
     *                                  not strictly ascending, a count is not
176
     *                                  positive, or an accepting node stores no value
177
     */
178
    public CompiledNode(final char[] edgeLabels, final CompiledNode<V>[] children, final V[] orderedValues,
179
            final boolean acceptsRemainingInput, final int maxExpandedIndex, final int... orderedCounts) {
180
        Objects.requireNonNull(edgeLabels, "edgeLabels");
181
        Objects.requireNonNull(children, "children");
182
        Objects.requireNonNull(orderedValues, "orderedValues");
183
        Objects.requireNonNull(orderedCounts, "orderedCounts");
184
185 2 1. <init> : negated conditional → KILLED
2. <init> : changed conditional boundary → KILLED
        if (maxExpandedIndex < 0) {
186
            throw new IllegalArgumentException("maxExpandedIndex must be non-negative.");
187
        }
188
189 1 1. <init> : negated conditional → KILLED
        if (edgeLabels.length != children.length) {
190
            throw new IllegalArgumentException("edgeLabels and children must have the same length.");
191
        }
192 1 1. <init> : negated conditional → KILLED
        if (orderedValues.length != orderedCounts.length) {
193
            throw new IllegalArgumentException("orderedValues and orderedCounts must have the same length.");
194
        }
195 1 1. <init> : removed call to org/egothor/stemmer/trie/CompiledNode::validateEdges → KILLED
        validateEdges(edgeLabels, children);
196 1 1. <init> : removed call to org/egothor/stemmer/trie/CompiledNode::validateValues → KILLED
        validateValues(orderedValues, orderedCounts);
197
        // An accepting node may also carry child edges: LookupMode.FIRST short-circuits
198
        // at the accept (children inert), while LookupMode.LAST/ALL follow the deeper
199
        // edges. Such nodes arise when a custom pair is added through a contracted
200
        // generalization.
201 2 1. <init> : negated conditional → KILLED
2. <init> : negated conditional → KILLED
        if (acceptsRemainingInput && orderedValues.length == 0) {
202
            throw new IllegalArgumentException("Accepting nodes must store at least one value.");
203
        }
204
205
        this.edgeLabels = edgeLabels;
206
        this.children = children;
207
        this.orderedValues = orderedValues;
208
        this.orderedCounts = orderedCounts;
209
        this.acceptsRemainingInput = acceptsRemainingInput;
210
211 2 1. <init> : negated conditional → KILLED
2. <init> : negated conditional → KILLED
        if (edgeLabels.length == 0 || maxExpandedIndex == 0) {
212
            this.denseChildren = null;
213
            this.denseEdgeMin = 0;
214
            return;
215
        }
216
217
        final int minEdge = edgeLabels[0];
218 1 1. <init> : Replaced integer subtraction with addition → KILLED
        final int maxEdge = edgeLabels[edgeLabels.length - 1];
219 1 1. <init> : Replaced integer subtraction with addition → SURVIVED
        final int span = maxEdge - minEdge;
220
221 4 1. <init> : changed conditional boundary → SURVIVED
2. <init> : changed conditional boundary → SURVIVED
3. <init> : negated conditional → KILLED
4. <init> : negated conditional → KILLED
        if (span < 0 || span > maxExpandedIndex) {
222
            this.denseChildren = null;
223
            this.denseEdgeMin = 0;
224
            return;
225
        }
226
227
        @SuppressWarnings("unchecked")
228 1 1. <init> : Replaced integer addition with subtraction → KILLED
        final CompiledNode<V>[] dense = new CompiledNode[span + 1];
229 2 1. <init> : changed conditional boundary → KILLED
2. <init> : negated conditional → KILLED
        for (int edgeIndex = 0; edgeIndex < edgeLabels.length; edgeIndex++) {
230 1 1. <init> : Replaced integer subtraction with addition → KILLED
            dense[edgeLabels[edgeIndex] - minEdge] = children[edgeIndex];
231
        }
232
233
        this.denseChildren = dense;
234
        this.denseEdgeMin = minEdge;
235
    }
236
237
    /**
238
     * Validates the sparse edge arrays before they become compiled-node backing
239
     * storage.
240
     *
241
     * @param edgeLabels transition labels, in the order used for lookup
242
     * @param children   child references aligned with {@code edgeLabels}
243
     * @throws NullPointerException     if a child reference is {@code null}
244
     * @throws IllegalArgumentException if labels are not strictly ascending
245
     */
246
    @SuppressWarnings("PMD.UseVarargs")
247
    private static void validateEdges(final char[] edgeLabels, final Object[] children) {
248 2 1. validateEdges : negated conditional → KILLED
2. validateEdges : changed conditional boundary → KILLED
        for (int edgeIndex = 0; edgeIndex < edgeLabels.length; edgeIndex++) {
249
            Objects.requireNonNull(children[edgeIndex], "children[" + edgeIndex + "]");
250 5 1. validateEdges : changed conditional boundary → SURVIVED
2. validateEdges : negated conditional → KILLED
3. validateEdges : changed conditional boundary → KILLED
4. validateEdges : negated conditional → KILLED
5. validateEdges : Replaced integer subtraction with addition → KILLED
            if (edgeIndex > 0 && edgeLabels[edgeIndex - 1] >= edgeLabels[edgeIndex]) {
251
                throw new IllegalArgumentException("edgeLabels must be strictly ascending.");
252
            }
253
        }
254
    }
255
256
    /**
257
     * Validates node-local values and their aligned occurrence counts.
258
     *
259
     * @param orderedValues values in deterministic lookup order
260
     * @param orderedCounts occurrence counts aligned with {@code orderedValues}
261
     * @throws NullPointerException     if a stored value is {@code null}
262
     * @throws IllegalArgumentException if an occurrence count is not positive
263
     */
264
    @SuppressWarnings("PMD.UseVarargs")
265
    private static void validateValues(final Object[] orderedValues, final int[] orderedCounts) {
266 2 1. validateValues : negated conditional → KILLED
2. validateValues : changed conditional boundary → KILLED
        for (int valueIndex = 0; valueIndex < orderedValues.length; valueIndex++) {
267
            Objects.requireNonNull(orderedValues[valueIndex], "orderedValues[" + valueIndex + "]");
268 2 1. validateValues : negated conditional → KILLED
2. validateValues : changed conditional boundary → KILLED
            if (orderedCounts[valueIndex] < 1) { // NOPMD
269
                throw new IllegalArgumentException("orderedCounts must contain only positive values.");
270
            }
271
        }
272
    }
273
274
    /**
275
     * Returns the internal edge-label array.
276
     *
277
     * <p>
278
     * The returned array is not copied for performance reasons and must be treated
279
     * as read-only.
280
     *
281
     * @return internal edge-label array
282
     */
283
    @SuppressWarnings("PMD.MethodReturnsInternalArray")
284
    public char[] edgeLabels() {
285 1 1. edgeLabels : replaced return value with null for org/egothor/stemmer/trie/CompiledNode::edgeLabels → KILLED
        return this.edgeLabels;
286
    }
287
288
    /**
289
     * Returns the internal child-node array.
290
     *
291
     * <p>
292
     * The returned array is not copied for performance reasons and must be treated
293
     * as read-only by external callers.
294
     *
295
     * @return internal child-node array
296
     */
297
    @SuppressWarnings("PMD.MethodReturnsInternalArray")
298
    public CompiledNode<V>[] children() {
299 1 1. children : replaced return value with null for org/egothor/stemmer/trie/CompiledNode::children → KILLED
        return this.children;
300
    }
301
302
    /**
303
     * Returns the internal ordered-values array.
304
     *
305
     * <p>
306
     * The returned array is not copied for performance reasons and must be treated
307
     * as read-only.
308
     *
309
     * @return internal ordered-values array
310
     */
311
    @SuppressWarnings("PMD.MethodReturnsInternalArray")
312
    public V[] orderedValues() {
313 1 1. orderedValues : replaced return value with null for org/egothor/stemmer/trie/CompiledNode::orderedValues → KILLED
        return this.orderedValues;
314
    }
315
316
    /**
317
     * Returns the internal ordered-counts array.
318
     *
319
     * <p>
320
     * The returned array is not copied for performance reasons and must be treated
321
     * as read-only.
322
     *
323
     * @return internal ordered-counts array
324
     */
325
    @SuppressWarnings("PMD.MethodReturnsInternalArray")
326
    public int[] orderedCounts() {
327 1 1. orderedCounts : replaced return value with null for org/egothor/stemmer/trie/CompiledNode::orderedCounts → KILLED
        return this.orderedCounts;
328
    }
329
330
    /**
331
     * Returns the number of child edges represented by this node.
332
     *
333
     * @return child edge count
334
     */
335
    public int edgeCount() {
336 1 1. edgeCount : replaced int return with 0 for org/egothor/stemmer/trie/CompiledNode::edgeCount → KILLED
        return this.edgeLabels.length;
337
    }
338
339
    /**
340
     * Returns the number of values stored in this node.
341
     *
342
     * @return value count
343
     */
344
    public int valueCount() {
345 1 1. valueCount : replaced int return with 0 for org/egothor/stemmer/trie/CompiledNode::valueCount → KILLED
        return this.orderedValues.length;
346
    }
347
348
    /**
349
     * Indicates whether this node stores any values.
350
     *
351
     * @return {@code true} when values are present at this node
352
     */
353
    public boolean hasValues() {
354 3 1. hasValues : changed conditional boundary → KILLED
2. hasValues : replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::hasValues → KILLED
3. hasValues : negated conditional → KILLED
        return this.orderedValues.length > 0;
355
    }
356
357
    /**
358
     * Indicates whether this node has child edges.
359
     *
360
     * @return {@code true} when this node has at least one outgoing edge
361
     */
362
    public boolean hasChildren() {
363 3 1. hasChildren : replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::hasChildren → KILLED
2. hasChildren : negated conditional → KILLED
3. hasChildren : changed conditional boundary → KILLED
        return this.edgeLabels.length > 0;
364
    }
365
366
    /**
367
     * Indicates whether this node has no child edges.
368
     *
369
     * @return {@code true} when this node is a terminal leaf node
370
     */
371
    public boolean isLeaf() {
372 2 1. isLeaf : replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::isLeaf → KILLED
2. isLeaf : negated conditional → KILLED
        return !hasChildren();
373
    }
374
375
    /**
376
     * Indicates whether this node accepts any remaining lookup input.
377
     *
378
     * @return {@code true} for a contracted accepting leaf
379
     */
380
    public boolean acceptsRemainingInput() {
381 2 1. acceptsRemainingInput : replaced boolean return with false for org/egothor/stemmer/trie/CompiledNode::acceptsRemainingInput → KILLED
2. acceptsRemainingInput : replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::acceptsRemainingInput → KILLED
        return this.acceptsRemainingInput;
382
    }
383
384
    /**
385
     * Tests whether an edge label is present at this node.
386
     *
387
     * @param edge edge label
388
     * @return {@code true} if this node contains the supplied edge label
389
     */
390
    public boolean hasEdge(final char edge) {
391 2 1. hasEdge : replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::hasEdge → KILLED
2. hasEdge : negated conditional → KILLED
        return findChild(edge) != null;
392
    }
393
394
    /**
395
     * Indicates whether this node has a dense direct-index child lookup table.
396
     *
397
     * @return {@code true} when a direct-index child table is available
398
     */
399
    public boolean hasDenseLookup() {
400 2 1. hasDenseLookup : replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::hasDenseLookup → KILLED
2. hasDenseLookup : negated conditional → KILLED
        return this.denseChildren != null;
401
    }
402
403
    /**
404
     * Returns a small memory-related metric describing this node's dense table
405
     * size.
406
     *
407
     * @return number of dense table slots, or {@code 0} when dense lookup is not
408
     *         enabled
409
     */
410
    public int denseTableLength() {
411 2 1. denseTableLength : replaced int return with 0 for org/egothor/stemmer/trie/CompiledNode::denseTableLength → SURVIVED
2. denseTableLength : negated conditional → SURVIVED
        return this.denseChildren == null ? 0 : this.denseChildren.length;
412
    }
413
414
    /**
415
     * Returns a compact structural summary used by diagnostics and tests.
416
     *
417
     * @return summary hash for node structure and contents
418
     */
419
    @Override
420
    public int hashCode() {
421
        int hash = Arrays.hashCode(this.edgeLabels);
422 2 1. hashCode : Replaced integer multiplication with division → SURVIVED
2. hashCode : Replaced integer addition with subtraction → SURVIVED
        hash = 31 * hash + Arrays.hashCode(this.children);
423 2 1. hashCode : Replaced integer multiplication with division → SURVIVED
2. hashCode : Replaced integer addition with subtraction → SURVIVED
        hash = 31 * hash + Arrays.hashCode(this.orderedValues);
424 2 1. hashCode : Replaced integer addition with subtraction → SURVIVED
2. hashCode : Replaced integer multiplication with division → SURVIVED
        hash = 31 * hash + Arrays.hashCode(this.orderedCounts);
425 2 1. hashCode : Replaced integer addition with subtraction → SURVIVED
2. hashCode : Replaced integer multiplication with division → SURVIVED
        hash = 31 * hash + Objects.hash(this.denseEdgeMin);
426 2 1. hashCode : Replaced integer addition with subtraction → SURVIVED
2. hashCode : Replaced integer multiplication with division → SURVIVED
        hash = 31 * hash + Boolean.hashCode(this.acceptsRemainingInput);
427 3 1. hashCode : Replaced integer multiplication with division → SURVIVED
2. hashCode : negated conditional → SURVIVED
3. hashCode : Replaced integer addition with subtraction → SURVIVED
        hash = 31 * hash + (hasDenseLookup() ? Arrays.hashCode(this.denseChildren) : 0);
428 1 1. hashCode : replaced int return with 0 for org/egothor/stemmer/trie/CompiledNode::hashCode → SURVIVED
        return hash;
429
    }
430
431
    /**
432
     * Compares structural node content, including dense table availability.
433
     *
434
     * @param object comparison object
435
     * @return {@code true} when nodes describe identical structure and payload
436
     */
437
    @Override
438
    public boolean equals(final Object object) {
439 1 1. equals : negated conditional → SURVIVED
        if (this == object) {
440 1 1. equals : replaced boolean return with false for org/egothor/stemmer/trie/CompiledNode::equals → NO_COVERAGE
            return true;
441
        }
442 1 1. equals : negated conditional → KILLED
        if (!(object instanceof CompiledNode<?> other)) {
443 1 1. equals : replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::equals → NO_COVERAGE
            return false;
444
        }
445 3 1. equals : replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::equals → SURVIVED
2. equals : negated conditional → KILLED
3. equals : negated conditional → KILLED
        return Arrays.equals(this.edgeLabels, other.edgeLabels) && Arrays.equals(this.children, other.children)
446 1 1. equals : negated conditional → KILLED
                && Arrays.equals(this.orderedValues, other.orderedValues)
447 3 1. equals : negated conditional → KILLED
2. equals : negated conditional → KILLED
3. equals : negated conditional → KILLED
                && Arrays.equals(this.orderedCounts, other.orderedCounts) && this.denseEdgeMin == other.denseEdgeMin
448
                && this.acceptsRemainingInput == other.acceptsRemainingInput
449 1 1. equals : negated conditional → KILLED
                && Arrays.equals(this.denseChildren, other.denseChildren);
450
    }
451
452
    /**
453
     * Returns a short summary useful for debugging and diagnostics.
454
     *
455
     * @return textual node summary
456
     */
457
    @Override
458
    public String toString() {
459 1 1. toString : replaced return value with "" for org/egothor/stemmer/trie/CompiledNode::toString → NO_COVERAGE
        return "CompiledNode{" + "edgeCount=" + this.edgeLabels.length + ", orderedValueCount="
460
                + this.orderedValues.length + ", acceptsRemainingInput=" + this.acceptsRemainingInput
461
                + ", denseTableLength=" + denseTableLength() + '}';
462
    }
463
464
    /**
465
     * Finds a child for the supplied edge character.
466
     * 
467
     * Lookup order is:
468
     * <ol>
469
     * <li>dense array index (if the label interval is compact enough),</li>
470
     * <li>small-child linear scan when the fallback node has
471
     * {@value #LINEAR_CHILD_COUNT_THRESHOLD} or fewer edges,</li>
472
     * <li>binary search over sorted labels.</li>
473
     * </ol>
474
     *
475
     * @param edge edge character
476
     * @return child node, or {@code null} if absent
477
     */
478
    public CompiledNode<V> findChild(final char edge) {
479
        final int childCount = this.edgeLabels.length;
480 1 1. findChild : negated conditional → KILLED
        if (childCount == 0) {
481
            return null;
482
        }
483
484 1 1. findChild : negated conditional → KILLED
        if (this.denseChildren != null) {
485 1 1. findChild : Replaced integer subtraction with addition → KILLED
            final int denseIndex = edge - this.denseEdgeMin;
486 4 1. findChild : negated conditional → KILLED
2. findChild : changed conditional boundary → KILLED
3. findChild : negated conditional → KILLED
4. findChild : changed conditional boundary → KILLED
            if (denseIndex < 0 || denseIndex >= this.denseChildren.length) {
487
                return null;
488
            }
489 1 1. findChild : replaced return value with null for org/egothor/stemmer/trie/CompiledNode::findChild → KILLED
            return this.denseChildren[denseIndex];
490
        }
491
492 2 1. findChild : negated conditional → SURVIVED
2. findChild : changed conditional boundary → SURVIVED
        if (childCount <= LINEAR_CHILD_COUNT_THRESHOLD) {
493 2 1. findChild : negated conditional → KILLED
2. findChild : changed conditional boundary → KILLED
            for (int index = 0; index < childCount; index++) {
494 1 1. findChild : negated conditional → KILLED
                if (this.edgeLabels[index] == edge) {
495 1 1. findChild : replaced return value with null for org/egothor/stemmer/trie/CompiledNode::findChild → KILLED
                    return this.children[index];
496
                }
497
            }
498
            return null;
499
        }
500
501
        final int index = Arrays.binarySearch(this.edgeLabels, edge);
502 2 1. findChild : changed conditional boundary → SURVIVED
2. findChild : negated conditional → KILLED
        if (index < 0) {
503
            return null;
504
        }
505 1 1. findChild : replaced return value with null for org/egothor/stemmer/trie/CompiledNode::findChild → KILLED
        return this.children[index];
506
    }
507
}

Mutations

185

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeShouldRejectMismatchedEdgeAndChildArrays()]
negated conditional → KILLED

2.2
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesBinarySearchForLargeDegree()]
changed conditional boundary → KILLED

189

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeShouldRejectMismatchedEdgeAndChildArrays()]
negated conditional → KILLED

192

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeShouldRejectMismatchedValueArrays()]
negated conditional → KILLED

195

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeShouldRejectInvalidElements()]
removed call to org/egothor/stemmer/trie/CompiledNode::validateEdges → KILLED

196

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeShouldRejectInvalidElements()]
removed call to org/egothor/stemmer/trie/CompiledNode::validateValues → KILLED

201

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
negated conditional → KILLED

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

211

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
negated conditional → KILLED

2.2
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
negated conditional → KILLED

218

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
Replaced integer subtraction with addition → KILLED

219

1.1
Location : <init>
Killed by : none
Replaced integer subtraction with addition → SURVIVED
Covering tests

221

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

2.2
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
negated conditional → KILLED

3.3
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
negated conditional → KILLED

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

228

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
Replaced integer addition with subtraction → KILLED

229

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

2.2
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
negated conditional → KILLED

230

1.1
Location : <init>
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
Replaced integer subtraction with addition → KILLED

248

1.1
Location : validateEdges
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
negated conditional → KILLED

2.2
Location : validateEdges
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
changed conditional boundary → KILLED

250

1.1
Location : validateEdges
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
negated conditional → KILLED

2.2
Location : validateEdges
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
changed conditional boundary → KILLED

3.3
Location : validateEdges
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
negated conditional → KILLED

4.4
Location : validateEdges
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

5.5
Location : validateEdges
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
Replaced integer subtraction with addition → KILLED

266

1.1
Location : validateValues
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
negated conditional → KILLED

2.2
Location : validateValues
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
changed conditional boundary → KILLED

268

1.1
Location : validateValues
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
negated conditional → KILLED

2.2
Location : validateValues
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesBinarySearchForLargeDegree()]
changed conditional boundary → KILLED

285

1.1
Location : edgeLabels
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
replaced return value with null for org/egothor/stemmer/trie/CompiledNode::edgeLabels → KILLED

299

1.1
Location : children
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
replaced return value with null for org/egothor/stemmer/trie/CompiledNode::children → KILLED

313

1.1
Location : orderedValues
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
replaced return value with null for org/egothor/stemmer/trie/CompiledNode::orderedValues → KILLED

327

1.1
Location : orderedCounts
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeAccessorsShouldExposeDocumentedBackingArrays()]
replaced return value with null for org/egothor/stemmer/trie/CompiledNode::orderedCounts → KILLED

336

1.1
Location : edgeCount
Killed by : org.egothor.stemmer.FrequencyTrieBuildersTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.FrequencyTrieBuildersTest]/[method:shouldMeasureLogicalPathsThroughSharedSubtree()]
replaced int return with 0 for org/egothor/stemmer/trie/CompiledNode::edgeCount → KILLED

345

1.1
Location : valueCount
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
replaced int return with 0 for org/egothor/stemmer/trie/CompiledNode::valueCount → KILLED

354

1.1
Location : hasValues
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
changed conditional boundary → KILLED

2.2
Location : hasValues
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::hasValues → KILLED

3.3
Location : hasValues
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
negated conditional → KILLED

363

1.1
Location : hasChildren
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::hasChildren → KILLED

2.2
Location : hasChildren
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
negated conditional → KILLED

3.3
Location : hasChildren
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
changed conditional boundary → KILLED

372

1.1
Location : isLeaf
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::isLeaf → KILLED

2.2
Location : isLeaf
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
negated conditional → KILLED

381

1.1
Location : acceptsRemainingInput
Killed by : org.egothor.stemmer.FrequencyTrieLookupModeTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.FrequencyTrieLookupModeTest]/[method:firstSelectsShallowestAccepting()]
replaced boolean return with false for org/egothor/stemmer/trie/CompiledNode::acceptsRemainingInput → KILLED

2.2
Location : acceptsRemainingInput
Killed by : org.egothor.stemmer.FrequencyTrieLookupModeTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.FrequencyTrieLookupModeTest]/[method:firstSelectsShallowestAccepting()]
replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::acceptsRemainingInput → KILLED

391

1.1
Location : hasEdge
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::hasEdge → KILLED

2.2
Location : hasEdge
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
negated conditional → KILLED

400

1.1
Location : hasDenseLookup
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesBinarySearchForLargeDegree()]
replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::hasDenseLookup → KILLED

2.2
Location : hasDenseLookup
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesBinarySearchForLargeDegree()]
negated conditional → KILLED

411

1.1
Location : denseTableLength
Killed by : none
replaced int return with 0 for org/egothor/stemmer/trie/CompiledNode::denseTableLength → SURVIVED
Covering tests

2.2
Location : denseTableLength
Killed by : none
negated conditional → SURVIVED Covering tests

422

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

2.2
Location : hashCode
Killed by : none
Replaced integer addition with subtraction → SURVIVED Covering tests

423

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

2.2
Location : hashCode
Killed by : none
Replaced integer addition with subtraction → SURVIVED Covering tests

424

1.1
Location : hashCode
Killed by : none
Replaced integer addition with subtraction → SURVIVED
Covering tests

2.2
Location : hashCode
Killed by : none
Replaced integer multiplication with division → SURVIVED Covering tests

425

1.1
Location : hashCode
Killed by : none
Replaced integer addition with subtraction → SURVIVED
Covering tests

2.2
Location : hashCode
Killed by : none
Replaced integer multiplication with division → SURVIVED Covering tests

426

1.1
Location : hashCode
Killed by : none
Replaced integer addition with subtraction → SURVIVED
Covering tests

2.2
Location : hashCode
Killed by : none
Replaced integer multiplication with division → SURVIVED Covering tests

427

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

2.2
Location : hashCode
Killed by : none
negated conditional → SURVIVED Covering tests

3.3
Location : hashCode
Killed by : none
Replaced integer addition with subtraction → SURVIVED Covering tests

428

1.1
Location : hashCode
Killed by : none
replaced int return with 0 for org/egothor/stemmer/trie/CompiledNode::hashCode → SURVIVED
Covering tests

439

1.1
Location : equals
Killed by : none
negated conditional → SURVIVED
Covering tests

440

1.1
Location : equals
Killed by : none
replaced boolean return with false for org/egothor/stemmer/trie/CompiledNode::equals → NO_COVERAGE

442

1.1
Location : equals
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeEqualsAndHashCodeAlignForIdenticalStructure()]
negated conditional → KILLED

443

1.1
Location : equals
Killed by : none
replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::equals → NO_COVERAGE

445

1.1
Location : equals
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeEqualsAndHashCodeAlignForIdenticalStructure()]
negated conditional → KILLED

2.2
Location : equals
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeEqualsAndHashCodeAlignForIdenticalStructure()]
negated conditional → KILLED

3.3
Location : equals
Killed by : none
replaced boolean return with true for org/egothor/stemmer/trie/CompiledNode::equals → SURVIVED
Covering tests

446

1.1
Location : equals
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeEqualsAndHashCodeAlignForIdenticalStructure()]
negated conditional → KILLED

447

1.1
Location : equals
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeEqualsAndHashCodeAlignForIdenticalStructure()]
negated conditional → KILLED

2.2
Location : equals
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeEqualsAndHashCodeAlignForIdenticalStructure()]
negated conditional → KILLED

3.3
Location : equals
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeEqualsAndHashCodeAlignForIdenticalStructure()]
negated conditional → KILLED

449

1.1
Location : equals
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeEqualsAndHashCodeAlignForIdenticalStructure()]
negated conditional → KILLED

459

1.1
Location : toString
Killed by : none
replaced return value with "" for org/egothor/stemmer/trie/CompiledNode::toString → NO_COVERAGE

480

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
negated conditional → KILLED

484

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesBinarySearchForLargeDegree()]
negated conditional → KILLED

485

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
Replaced integer subtraction with addition → KILLED

486

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
negated conditional → KILLED

2.2
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeReportsNodeStateHelpers()]
changed conditional boundary → KILLED

3.3
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
negated conditional → KILLED

4.4
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
changed conditional boundary → KILLED

489

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesDenseLookupForCompactIntervals()]
replaced return value with null for org/egothor/stemmer/trie/CompiledNode::findChild → KILLED

492

1.1
Location : findChild
Killed by : none
negated conditional → SURVIVED
Covering tests

2.2
Location : findChild
Killed by : none
changed conditional boundary → SURVIVED Covering tests

493

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesLinearScanForSmallDegree()]
negated conditional → KILLED

2.2
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesLinearScanForSmallDegree()]
changed conditional boundary → KILLED

494

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesLinearScanForSmallDegree()]
negated conditional → KILLED

495

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesLinearScanForSmallDegree()]
replaced return value with null for org/egothor/stemmer/trie/CompiledNode::findChild → KILLED

502

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

2.2
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesBinarySearchForLargeDegree()]
negated conditional → KILLED

505

1.1
Location : findChild
Killed by : org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest.[engine:junit-jupiter]/[class:org.egothor.stemmer.trie.CompiledNodeAndNodeDataTest]/[method:compiledNodeUsesBinarySearchForLargeDegree()]
replaced return value with null for org/egothor/stemmer/trie/CompiledNode::findChild → KILLED

Active mutators

Tests examined


Report generated by PIT 1.22.1