SteroidMap.java

1
/*
2
 * Copyright 2017 Federico Fissore <federico@fissore.org>
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
package org.fissore.steroids;
17
18
import java.util.*;
19
import java.util.function.Function;
20
import java.util.stream.Stream;
21
22
/**
23
 * SteroidMap is a {@link Map} on steroids.
24
 * It decorates {@link Map} providing a fluent interface and a shorter syntax. It allows you to navigate a map structure without using casts.
25
 * It doesn't require any code to work with other frameworks/libraries: if they know how to deal with {@link Map}s, they work with SteroidMap as well.
26
 * Custom implementations should implement SteroidMap and delegate the actual storage to a backing map implementation, such as {@link HashMap} or {@link java.util.concurrent.ConcurrentHashMap}.
27
 *
28
 * @param <K> the type of the keys
29
 */
30
public interface SteroidMap<K> extends Map<K, Object> {
31
32
  /* content manipulation */
33
34
  /**
35
   * {@link #put(Object, Object) Puts} a value if not null. Fluent version of {@link #put(Object, Object)}
36
   *
37
   * @param key   key with which the specified value is to be associated
38
   * @param value value to be associated with the specified key
39
   * @return this instance
40
   */
41
  default SteroidMap<K> add(K key, Object value) {
42 1 1. add : negated conditional → KILLED
    if (value != null) {
43
      put(key, value);
44
    }
45 1 1. add : mutated return of Object value for org/fissore/steroids/SteroidMap::add to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return this;
46
  }
47
48
  /**
49
   * {@link #put(Object, Object) Puts} all non null values from given maps into this map. Fluent version of {@link #putAll(Map)}
50
   *
51
   * @param sources mappings to be stored in this map
52
   * @return this instance
53
   * @see #addAll(Stream)
54
   */
55
  default SteroidMap<K> addAll(Map<K, Object>... sources) {
56 1 1. addAll : mutated return of Object value for org/fissore/steroids/SteroidMap::addAll to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return addAll(Stream.of(sources));
57
  }
58
59
  /**
60
   * {@link #put(Object, Object) Puts} all non null values from given maps into this map. Fluent version of {@link #putAll(Map)}
61
   *
62
   * @param sources mappings to be stored in this map
63
   * @return this instance
64
   * @see #addAll(Stream)
65
   */
66
  default SteroidMap<K> addAll(Collection<Map<K, Object>> sources) {
67 1 1. addAll : mutated return of Object value for org/fissore/steroids/SteroidMap::addAll to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return addAll(sources.stream());
68
  }
69
70
  /**
71
   * {@link #put(Object, Object) Puts} all non null values from given maps into this map. Fluent version of {@link #putAll(Map)}
72
   *
73
   * @param sources mappings to be stored in this map
74
   * @return this instance
75
   */
76
  default SteroidMap<K> addAll(Stream<Map<K, Object>> sources) {
77
    synchronized (this) {
78 2 1. addAll : removed call to java/util/stream/Stream::forEach → KILLED
2. lambda$addAll$0 : removed call to java/util/Map::forEach → KILLED
      sources.forEach(source -> source.forEach(this::add));
79
    }
80 1 1. addAll : mutated return of Object value for org/fissore/steroids/SteroidMap::addAll to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return this;
81
  }
82
83
  /**
84
   * {@link #put(Object, Object) Puts} non null keys from source into this map. If keys is not specified, it behaves as {@link #addAll(Map[])}
85
   *
86
   * @param source the map to add to this map
87
   * @param keys   if specified, only given keys will be added
88
   * @return this instance
89
   */
90
  default SteroidMap<K> addFrom(Map<K, Object> source, K... keys) {
91 1 1. addFrom : mutated return of Object value for org/fissore/steroids/SteroidMap::addFrom to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return addFrom(source, new HashSet<>(Arrays.asList(keys)));
92
  }
93
94
  /**
95
   * {@link #put(Object, Object) Puts} non null keys from source into this map. If keys is not specified, it behaves as {@link #addAll(Map[])}
96
   *
97
   * @param source the map to add to this map
98
   * @param keys   if specified, only these keys will be added
99
   * @return this instance
100
   */
101
  default SteroidMap<K> addFrom(Map<K, Object> source, Collection<K> keys) {
102 1 1. addFrom : negated conditional → KILLED
    if (source == null) {
103 1 1. addFrom : mutated return of Object value for org/fissore/steroids/SteroidMap::addFrom to ( if (x != null) null else throw new RuntimeException ) → KILLED
      return this;
104
    }
105
106 1 1. addFrom : negated conditional → KILLED
    if (keys.size() == 0) {
107 1 1. addFrom : mutated return of Object value for org/fissore/steroids/SteroidMap::addFrom to ( if (x != null) null else throw new RuntimeException ) → KILLED
      return addAll(source);
108
    }
109
110
    synchronized (this) {
111
      source.entrySet().stream()
112 1 1. lambda$addFrom$1 : replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED
          .filter(e -> keys.contains(e.getKey()))
113 1 1. addFrom : removed call to java/util/stream/Stream::forEach → KILLED
          .forEach(e -> add(e.getKey(), e.getValue()));
114
    }
115
116 1 1. addFrom : mutated return of Object value for org/fissore/steroids/SteroidMap::addFrom to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return this;
117
  }
118
119
  /**
120
   * Renames the specified key, if present. It runs a in a synchronized block
121
   *
122
   * @param oldKey the old key
123
   * @param newKey the new key
124
   * @return this instance
125
   */
126
  default SteroidMap<K> renameKey(K oldKey, K newKey) {
127
    synchronized (this) {
128 1 1. renameKey : negated conditional → KILLED
      if (!containsKey(oldKey)) {
129 1 1. renameKey : mutated return of Object value for org/fissore/steroids/SteroidMap::renameKey to ( if (x != null) null else throw new RuntimeException ) → KILLED
        return this;
130
      }
131
      put(newKey, get(oldKey));
132
      remove(oldKey);
133
    }
134 1 1. renameKey : mutated return of Object value for org/fissore/steroids/SteroidMap::renameKey to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return this;
135
  }
136
137
  /**
138
   * Removes given keys from this map. Fluent version of {@link #remove(Object)}
139
   *
140
   * @param keys the keys to remove
141
   * @return this instance
142
   * @see #del(Stream)
143
   */
144
  default SteroidMap<K> del(K... keys) {
145 1 1. del : mutated return of Object value for org/fissore/steroids/SteroidMap::del to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return del(Stream.of(keys));
146
  }
147
148
  /**
149
   * Removes given keys from this map. Fluent version of {@link #remove(Object)}
150
   *
151
   * @param keys the keys to remove
152
   * @return this instance
153
   * @see #del(Stream)
154
   */
155
  default SteroidMap<K> del(Collection<K> keys) {
156 1 1. del : mutated return of Object value for org/fissore/steroids/SteroidMap::del to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return del(keys.stream());
157
  }
158
159
  /**
160
   * Removes given keys from this map. Fluent version of {@link #remove(Object)}
161
   *
162
   * @param keys the keys to remove
163
   * @return this instance
164
   */
165
  default SteroidMap<K> del(Stream<K> keys) {
166
    synchronized (this) {
167 1 1. del : removed call to java/util/stream/Stream::forEach → KILLED
      keys.forEach(this::remove);
168
    }
169 1 1. del : mutated return of Object value for org/fissore/steroids/SteroidMap::del to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return this;
170
  }
171
172
  /* content extraction */
173
174
  /**
175
   * If given key is {@link #valued(Object) valued}, it's applied to provided valueReturner. Otherwise, defaultValue is returned.
176
   * Both checking if the key is {@link #valued(Object) valued} and applying valueReturner run in a synchronized block
177
   *
178
   * @param key           the key
179
   * @param defaultValue  the value to return if key is not {@link #valued(Object) valued}
180
   * @param valueReturner the function to apply the key to
181
   * @param <V>           the return type
182
   * @return either value from map or defaultValue
183
   */
184
  default <V> V defaultIfMissing(K key, V defaultValue, Function<K, V> valueReturner) {
185
    synchronized (this) {
186 1 1. defaultIfMissing : negated conditional → KILLED
      if (valued(key)) {
187 1 1. defaultIfMissing : mutated return of Object value for org/fissore/steroids/SteroidMap::defaultIfMissing to ( if (x != null) null else throw new RuntimeException ) → KILLED
        return valueReturner.apply(key);
188
      }
189
    }
190 1 1. defaultIfMissing : mutated return of Object value for org/fissore/steroids/SteroidMap::defaultIfMissing to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultValue;
191
  }
192
193
  /**
194
   * {@link #get(Object) Gets} given key and cast it to a Long
195
   *
196
   * @param key the key
197
   * @return value associated to key casted to Long
198
   */
199
  default long l(K key) {
200 1 1. l : replaced return of long value with value + 1 for org/fissore/steroids/SteroidMap::l → KILLED
    return (Long) get(key);
201
  }
202
203
  /**
204
   * {@link #get(Object) Gets} given key and cast it to a Long. If key is not {@link #valued(Object) valued}, it returns defaultValue
205
   *
206
   * @param key          the key
207
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
208
   * @return value associated to key, casted to Long. defaultValue if key is not {@link #valued(Object) valued}
209
   */
210
  default long l(K key, long defaultValue) {
211 1 1. l : replaced return of long value with value + 1 for org/fissore/steroids/SteroidMap::l → KILLED
    return defaultIfMissing(key, defaultValue, this::l);
212
  }
213
214
  /**
215
   * {@link #get(Object) Gets} given key and cast it to a Integer
216
   *
217
   * @param key the key
218
   * @return value associated to key casted to Integer
219
   */
220
  default int i(K key) {
221 1 1. i : replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED
    return (Integer) get(key);
222
  }
223
224
  /**
225
   * {@link #get(Object) Gets} given key and cast it to a Integer. If key is not {@link #valued(Object) valued}, it returns defaultValue
226
   *
227
   * @param key          the key
228
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
229
   * @return value associated to key, casted to Integer. defaultValue if key is not {@link #valued(Object) valued}
230
   */
231
  default int i(K key, int defaultValue) {
232 1 1. i : replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED
    return defaultIfMissing(key, defaultValue, this::i);
233
  }
234
235
  /**
236
   * {@link #get(Object) Gets} given key and cast it to a Double
237
   *
238
   * @param key the key
239
   * @return value associated to key casted to Double
240
   */
241
  default double d(K key) {
242 1 1. d : replaced return of double value with -(x + 1) for org/fissore/steroids/SteroidMap::d → KILLED
    return (Double) get(key);
243
  }
244
245
  /**
246
   * {@link #get(Object) Gets} given key and cast it to a Double. If key is not {@link #valued(Object) valued}, it returns defaultValue
247
   *
248
   * @param key          the key
249
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
250
   * @return value associated to key, casted to Double. defaultValue if key is not {@link #valued(Object) valued}
251
   */
252
  default double d(K key, double defaultValue) {
253 1 1. d : replaced return of double value with -(x + 1) for org/fissore/steroids/SteroidMap::d → KILLED
    return defaultIfMissing(key, defaultValue, this::d);
254
  }
255
256
  /**
257
   * {@link #get(Object) Gets} given key and cast it to a Float
258
   *
259
   * @param key the key
260
   * @return value associated to key casted to Float
261
   */
262
  default float f(K key) {
263 1 1. f : replaced return of float value with -(x + 1) for org/fissore/steroids/SteroidMap::f → KILLED
    return (Float) get(key);
264
  }
265
266
  /**
267
   * {@link #get(Object) Gets} given key and cast it to a Float. If key is not {@link #valued(Object) valued}, it returns defaultValue
268
   *
269
   * @param key          the key
270
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
271
   * @return value associated to key, casted to Float. defaultValue if key is not {@link #valued(Object) valued}
272
   */
273
  default float f(K key, float defaultValue) {
274 1 1. f : replaced return of float value with -(x + 1) for org/fissore/steroids/SteroidMap::f → KILLED
    return defaultIfMissing(key, defaultValue, this::f);
275
  }
276
277
  /**
278
   * {@link #get(Object) Gets} given key and cast it to a String
279
   *
280
   * @param key the key
281
   * @return value associated to key casted to String
282
   */
283
  default String s(K key) {
284 1 1. s : mutated return of Object value for org/fissore/steroids/SteroidMap::s to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return (String) get(key);
285
  }
286
287
  /**
288
   * {@link #get(Object) Gets} given key and cast it to a String. If key is not {@link #valued(Object) valued}, it returns defaultValue
289
   *
290
   * @param key          the key
291
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
292
   * @return value associated to key, casted to String. defaultValue if key is not {@link #valued(Object) valued}
293
   */
294
  default String s(K key, String defaultValue) {
295 1 1. s : mutated return of Object value for org/fissore/steroids/SteroidMap::s to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, this::s);
296
  }
297
298
  /**
299
   * {@link #get(Object) Gets} given key and cast it to a Boolean
300
   *
301
   * @param key the key
302
   * @return value associated to key casted to Boolean
303
   */
304
  default boolean b(K key) {
305 1 1. b : replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED
    return (Boolean) get(key);
306
  }
307
308
  /**
309
   * {@link #get(Object) Gets} given key and cast it to a Boolean. If key is not {@link #valued(Object) valued}, it returns defaultValue
310
   *
311
   * @param key          the key
312
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
313
   * @return value associated to key, casted to Boolean. defaultValue if key is not {@link #valued(Object) valued}
314
   */
315
  default boolean b(K key, boolean defaultValue) {
316 1 1. b : replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED
    return defaultIfMissing(key, defaultValue, this::b);
317
  }
318
319
  /**
320
   * {@link #get(Object) Gets} given key and cast it to type V
321
   *
322
   * @param key the key
323
   * @param <V> the return type
324
   * @return value associated to key casted to type V
325
   */
326
  default <V> V o(K key) {
327 1 1. o : mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return (V) get(key);
328
  }
329
330
  /**
331
   * {@link #get(Object) Gets} given key and transform it using given function
332
   *
333
   * @param key         the key
334
   * @param transformer a function used to change original value
335
   * @param <V>         the return type
336
   * @return value associated to key and transformed using function
337
   */
338
  default <V> V o(K key, Function<Object, V> transformer) {
339 1 1. o : mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return transformer.apply(get(key));
340
  }
341
342
  /**
343
   * {@link #get(Object) Gets} given key and cast it to type of given Class
344
   *
345
   * @param key   the key
346
   * @param clazz the clazz, useful only to make the compiler happy about type V
347
   * @param <V>   the return type
348
   * @return value associated to key casted to type V
349
   */
350
  @SuppressWarnings("unchecked")
351
  default <V> V o(K key, Class<V> clazz) {
352 1 1. o : mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return (V) get(key);
353
  }
354
355
  /**
356
   * {@link #get(Object) Gets} given key and cast it to a Object. If key is not {@link #valued(Object) valued}, it returns defaultValue
357
   *
358
   * @param key          the key
359
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
360
   * @param <V>          the return type
361
   * @return value associated to key, casted to Object. defaultValue if key is not {@link #valued(Object) valued}
362
   */
363
  @SuppressWarnings("unchecked")
364
  default <V> V o(K key, V defaultValue) {
365 1 1. o : mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, this::o);
366
  }
367
368
  /**
369
   * {@link #get(Object) Gets} given key and transform it using given function. If key is not {@link #valued(Object) valued}, it returns defaultValue
370
   *
371
   * @param key          the key
372
   * @param transformer  a function used to change original value
373
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
374
   * @param <V>          the return type
375
   * @return value associated to key, transformed using function. defaultValue if key is not {@link #valued(Object) valued}
376
   */
377
  default <V> V o(K key, Function<Object, V> transformer, V defaultValue) {
378 2 1. lambda$o$3 : mutated return of Object value for org/fissore/steroids/SteroidMap::lambda$o$3 to ( if (x != null) null else throw new RuntimeException ) → KILLED
2. o : mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, (k) -> o(k, transformer));
379
  }
380
381
  /**
382
   * {@link #get(Object) Gets} given key and cast it to a Date
383
   *
384
   * @param key the key
385
   * @return value associated to key casted to Date
386
   */
387
  default Date date(K key) {
388 1 1. date : mutated return of Object value for org/fissore/steroids/SteroidMap::date to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return (Date) get(key);
389
  }
390
391
  /**
392
   * {@link #get(Object) Gets} given key and cast it to a Date. If key is not {@link #valued(Object) valued}, it returns defaultValue
393
   *
394
   * @param key          the key
395
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
396
   * @return value associated to key, casted to Date. defaultValue if key is not {@link #valued(Object) valued}
397
   */
398
  default Date date(K key, Date defaultValue) {
399 1 1. date : mutated return of Object value for org/fissore/steroids/SteroidMap::date to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, this::date);
400
  }
401
402
  /**
403
   * A key is valued if <code>{@link #get(Object) get(key)} != null</code>
404
   *
405
   * @param key the key
406
   * @return true if {@link #get(Object) get(key)} != null
407
   */
408
  default boolean valued(K key) {
409 2 1. valued : negated conditional → KILLED
2. valued : replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED
    return get(key) != null;
410
  }
411
412
  /**
413
   * Opposite of {@link #valued(Object)}
414
   *
415
   * @param key the key
416
   * @return true if {@link #get(Object) get(key)} == null
417
   */
418
  default boolean notValued(K key) {
419 2 1. notValued : negated conditional → KILLED
2. notValued : replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED
    return !valued(key);
420
  }
421
422
  /**
423
   * {@link #get(Object) Gets} given key and cast it to a Collection&lt;V&gt;
424
   *
425
   * @param key the key
426
   * @param <V> the return type
427
   * @return value associated to key casted to Collection&lt;V&gt;
428
   */
429
  @SuppressWarnings("unchecked")
430
  default <V> Collection<V> collection(K key) {
431 1 1. collection : mutated return of Object value for org/fissore/steroids/SteroidMap::collection to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return (Collection<V>) get(key);
432
  }
433
434
  /**
435
   * {@link #get(Object) Gets} given key and cast it to a Collection&lt;V&gt;. If key is not {@link #valued(Object) valued}, it returns defaultValue
436
   *
437
   * @param key          the key
438
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
439
   * @param <V>          the return type
440
   * @return value associated to key, casted to Collection&lt;V&gt;. defaultValue if key is not {@link #valued(Object) valued}
441
   */
442
  default <V> Collection<V> collection(K key, Collection<V> defaultValue) {
443 1 1. collection : mutated return of Object value for org/fissore/steroids/SteroidMap::collection to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, this::collection);
444
  }
445
446
  /**
447
   * {@link #get(Object) Gets} given key and cast it to a List&lt;V&gt;
448
   *
449
   * @param key the key
450
   * @param <V> the return type
451
   * @return value associated to key casted to List&lt;V&gt;
452
   */
453
  @SuppressWarnings("unchecked")
454
  default <V> List<V> list(K key) {
455 1 1. list : mutated return of Object value for org/fissore/steroids/SteroidMap::list to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return (List<V>) get(key);
456
  }
457
458
  /**
459
   * {@link #get(Object) Gets} given key and cast it to a List&lt;V&gt;. If key is not {@link #valued(Object) valued}, it returns defaultValue
460
   *
461
   * @param key          the key
462
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
463
   * @param <V>          the return type
464
   * @return value associated to key, casted to List&lt;V&gt;. defaultValue if key is not {@link #valued(Object) valued}
465
   */
466
  default <V> List<V> list(K key, List<V> defaultValue) {
467 1 1. list : mutated return of Object value for org/fissore/steroids/SteroidMap::list to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, this::list);
468
  }
469
470
  /**
471
   * {@link #get(Object) Gets} given key, cast it to a Collection&lt;V&gt; and returns its Stream&lt;V&gt;
472
   *
473
   * @param key the key
474
   * @param <V> the return type
475
   * @return value associated to key casted to a Collection&lt;V&gt; and converted to a Stream&lt;V&gt;
476
   */
477
  @SuppressWarnings("unchecked")
478
  default <V> Stream<V> stream(K key) {
479 1 1. stream : mutated return of Object value for org/fissore/steroids/SteroidMap::stream to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return (Stream<V>) collection(key).stream();
480
  }
481
482
  /**
483
   * {@link #get(Object) Gets} given key, cast it to a Collection&lt;V&gt; and returns its Stream&lt;V&gt;. If key is not {@link #valued(Object) valued}, it returns defaultValue
484
   *
485
   * @param key          the key
486
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
487
   * @param <V>          the return type
488
   * @return value associated to key casted to a Collection&lt;V&gt; and converted to a Stream&lt;V&gt;. defaultValue if key is not {@link #valued(Object) valued}
489
   */
490
  default <V> Stream<V> stream(K key, Stream<V> defaultValue) {
491 1 1. stream : mutated return of Object value for org/fissore/steroids/SteroidMap::stream to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, this::stream);
492
  }
493
494
  /**
495
   * Creates a new SteroidMap made of given keys only. Keys must be {@link #valued(Object) valued}
496
   *
497
   * @param keys the keys used to create a new, filtered SteroidMap
498
   * @return a new, filtered, SteroidMap
499
   * @see #subMap(Stream)
500
   */
501
  default SteroidMap<K> subMap(K... keys) {
502 1 1. subMap : mutated return of Object value for org/fissore/steroids/SteroidMap::subMap to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return subMap(Stream.of(keys));
503
  }
504
505
  /**
506
   * Creates a new SteroidMap made of given keys only. Keys must be {@link #valued(Object) valued}
507
   *
508
   * @param keys the keys used to create a new, filtered SteroidMap
509
   * @return a new, filtered, SteroidMap
510
   * @see #subMap(Stream)
511
   */
512
  default SteroidMap<K> subMap(Collection<K> keys) {
513 1 1. subMap : mutated return of Object value for org/fissore/steroids/SteroidMap::subMap to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return subMap(keys.stream());
514
  }
515
516
  /**
517
   * Creates a new SteroidMap made of given keys only. Keys must be {@link #valued(Object) valued}
518
   *
519
   * @param keys the keys used to create a new, filtered SteroidMap
520
   * @return a new, filtered, SteroidMap
521
   */
522
  SteroidMap<K> subMap(Stream<K> keys);
523
524
  /**
525
   * Creates a new SteroidMap, backed by given backingMap and made of given keys only. Keys must be {@link #valued(Object) valued}
526
   *
527
   * @param backingMap the actual map to use as storage
528
   * @param keys       the keys used to create a new, filtered SteroidMap
529
   * @return a new, filtered, SteroidMap
530
   * @see #subMap(Map, Stream)
531
   */
532
  default SteroidMap<K> subMap(Map<K, Object> backingMap, K... keys) {
533 1 1. subMap : mutated return of Object value for org/fissore/steroids/SteroidMap::subMap to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return subMap(backingMap, Stream.of(keys));
534
  }
535
536
  /**
537
   * Creates a new SteroidMap, backed by given backingMap and made of given keys only. Keys must be {@link #valued(Object) valued}
538
   *
539
   * @param backingMap the actual map to use as storage
540
   * @param keys       the keys used to create a new, filtered SteroidMap
541
   * @return a new, filtered, SteroidMap
542
   * @see #subMap(Map, Stream)
543
   */
544
  default SteroidMap<K> subMap(Map<K, Object> backingMap, Collection<K> keys) {
545 1 1. subMap : mutated return of Object value for org/fissore/steroids/SteroidMap::subMap to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return subMap(backingMap, keys.stream());
546
  }
547
548
  /**
549
   * Creates a new SteroidMap, backed by given backingMap and made of given keys only. Keys must be {@link #valued(Object) valued}
550
   *
551
   * @param backingMap the actual map to use as storage
552
   * @param keys       the keys used to create a new, filtered SteroidMap
553
   * @return a new, filtered, SteroidMap
554
   */
555
  SteroidMap<K> subMap(Map<K, Object> backingMap, Stream<K> keys);
556
557
  /**
558
   * {@link #get(Object) Gets} given key and, if value is not of type SteroidMap, a new SteroidMap is created using value as backing map. Otherwise value is casted to SteroidMap and returned
559
   *
560
   * @param key the key
561
   * @return value associated to key, either casted to SteroidMap or used as backing map for a new SteroidMap
562
   */
563
  SteroidMap<K> map(K key);
564
565
  /**
566
   * {@link #get(Object) Gets} given key and, if value is not of type SteroidMap, a new SteroidMap is created using value as backing map. Otherwise value is casted to SteroidMap and returned. If key is not {@link #valued(Object) valued}, it returns defaultValue
567
   *
568
   * @param key          the key
569
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
570
   * @return value associated to key, either casted to SteroidMap or used as backing map for a new SteroidMap
571
   */
572
  default SteroidMap<K> map(K key, SteroidMap<K> defaultValue) {
573 1 1. map : mutated return of Object value for org/fissore/steroids/SteroidMap::map to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, this::map);
574
  }
575
576
  /**
577
   * {@link #get(Object) Gets} given key, cast it to a Collection&lt;? extends SteroidMap&lt;K&gt;&gt; and returns its Stream&lt;? extends SteroidMap&lt;K&gt;&gt;. Each entry is evaluated: if it's not of type SteroidMap, a new SteroidMap is created using value as backing map. If the key is not {@link #valued(Object) valued}, an empty Stream is returned
578
   *
579
   * @param key the key
580
   * @return value associated to key casted to a Collection&lt;? extends SteroidMap&lt;K&gt;&gt; and converted to a Stream&lt;? extends SteroidMap&lt;K&gt;&gt;, or an empty Stream if key is not {@link #valued(Object) valued}
581
   */
582
  default Stream<? extends SteroidMap<K>> maps(K key) {
583 2 1. lambda$maps$4 : mutated return of Object value for org/fissore/steroids/SteroidMap::lambda$maps$4 to ( if (x != null) null else throw new RuntimeException ) → KILLED
2. maps : mutated return of Object value for org/fissore/steroids/SteroidMap::maps to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, Stream.empty(), (k) -> stream(k).map(this::ensureMapIsOnSteroid));
584
  }
585
586
  /**
587
   * {@link #get(Object) Gets} given key, cast it to a Collection&lt;? extends SteroidMap&lt;K&gt;&gt; and returns its Stream&lt;? extends SteroidMap&lt;K&gt;&gt;. Each entry is evaluated: if it's not of type SteroidMap, a new SteroidMap is created using value as backing map. If the key is not {@link #valued(Object) valued}, it returns defaultValue
588
   *
589
   * @param key          the key
590
   * @param defaultValue the defaultValue to return if key is not {@link #valued(Object) valued}
591
   * @return value associated to key casted to a Collection&lt;? extends SteroidMap&lt;K&gt;&gt; and converted to a Stream&lt;? extends SteroidMap&lt;K&gt;&gt;, defaultValue if key is not {@link #valued(Object) valued}
592
   */
593
  default Stream<? extends SteroidMap<K>> maps(K key, Stream<? extends SteroidMap<K>> defaultValue) {
594 1 1. maps : mutated return of Object value for org/fissore/steroids/SteroidMap::maps to ( if (x != null) null else throw new RuntimeException ) → KILLED
    return defaultIfMissing(key, defaultValue, this::maps);
595
  }
596
597
  SteroidMap<K> ensureMapIsOnSteroid(Object value);
598
599
  /**
600
   * Returns a shallow copy of this map
601
   *
602
   * @return a shallow copy of this map
603
   */
604
  SteroidMap<K> copy();
605
606
}

Mutations

42

1.1
Location : add
Killed by : org.fissore.steroids.SteroidMapTest.shouldNavigateSubKeys(org.fissore.steroids.SteroidMapTest)
negated conditional → KILLED

45

1.1
Location : add
Killed by : org.fissore.steroids.SteroidMapTest.shouldFailToReturnADouble(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::add to ( if (x != null) null else throw new RuntimeException ) → KILLED

56

1.1
Location : addAll
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnACopy(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::addAll to ( if (x != null) null else throw new RuntimeException ) → KILLED

67

1.1
Location : addAll
Killed by : org.fissore.steroids.SteroidMapTest.shouldAllAllElementsFromCollectionOfOtherMaps(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::addAll to ( if (x != null) null else throw new RuntimeException ) → KILLED

78

1.1
Location : addAll
Killed by : org.fissore.steroids.SteroidMapTest.shouldAllAllElementsFromCollectionOfOtherMaps(org.fissore.steroids.SteroidMapTest)
removed call to java/util/stream/Stream::forEach → KILLED

2.2
Location : lambda$addAll$0
Killed by : org.fissore.steroids.SteroidMapTest.shouldAllAllElementsFromCollectionOfOtherMaps(org.fissore.steroids.SteroidMapTest)
removed call to java/util/Map::forEach → KILLED

80

1.1
Location : addAll
Killed by : org.fissore.steroids.SteroidMapTest.shouldAllAllElementsFromCollectionOfOtherMaps(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::addAll to ( if (x != null) null else throw new RuntimeException ) → KILLED

91

1.1
Location : addFrom
Killed by : org.fissore.steroids.SteroidMapTest.shouldNotMergeNullMaps(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::addFrom to ( if (x != null) null else throw new RuntimeException ) → KILLED

102

1.1
Location : addFrom
Killed by : org.fissore.steroids.SteroidMapTest.shouldNotMergeNullMaps(org.fissore.steroids.SteroidMapTest)
negated conditional → KILLED

103

1.1
Location : addFrom
Killed by : org.fissore.steroids.SteroidMapTest.shouldNotMergeNullMaps(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::addFrom to ( if (x != null) null else throw new RuntimeException ) → KILLED

106

1.1
Location : addFrom
Killed by : org.fissore.steroids.SteroidMapTest.shouldMergeSomeKeysOfAnotherMap(org.fissore.steroids.SteroidMapTest)
negated conditional → KILLED

107

1.1
Location : addFrom
Killed by : org.fissore.steroids.SteroidMapTest.shouldMergeSomeKeysOfAnotherMap(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::addFrom to ( if (x != null) null else throw new RuntimeException ) → KILLED

112

1.1
Location : lambda$addFrom$1
Killed by : org.fissore.steroids.SteroidMapTest.shouldMergeSomeKeysOfAnotherMap(org.fissore.steroids.SteroidMapTest)
replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED

113

1.1
Location : addFrom
Killed by : org.fissore.steroids.SteroidMapTest.shouldMergeSomeKeysOfAnotherMap(org.fissore.steroids.SteroidMapTest)
removed call to java/util/stream/Stream::forEach → KILLED

116

1.1
Location : addFrom
Killed by : org.fissore.steroids.SteroidMapTest.shouldMergeSomeKeysOfAnotherMap(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::addFrom to ( if (x != null) null else throw new RuntimeException ) → KILLED

128

1.1
Location : renameKey
Killed by : org.fissore.steroids.SteroidMapTest.shouldRenameAKey(org.fissore.steroids.SteroidMapTest)
negated conditional → KILLED

129

1.1
Location : renameKey
Killed by : org.fissore.steroids.SteroidMapTest.shouldRenameAKey(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::renameKey to ( if (x != null) null else throw new RuntimeException ) → KILLED

134

1.1
Location : renameKey
Killed by : org.fissore.steroids.SteroidMapTest.shouldRenameAKey(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::renameKey to ( if (x != null) null else throw new RuntimeException ) → KILLED

145

1.1
Location : del
Killed by : org.fissore.steroids.SteroidMapTest.shouldDeleteAKey(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::del to ( if (x != null) null else throw new RuntimeException ) → KILLED

156

1.1
Location : del
Killed by : org.fissore.steroids.SteroidMapTest.shouldDeleteCollectionOfKeys(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::del to ( if (x != null) null else throw new RuntimeException ) → KILLED

167

1.1
Location : del
Killed by : org.fissore.steroids.SteroidMapTest.shouldDeleteAKey(org.fissore.steroids.SteroidMapTest)
removed call to java/util/stream/Stream::forEach → KILLED

169

1.1
Location : del
Killed by : org.fissore.steroids.SteroidMapTest.shouldDeleteAKey(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::del to ( if (x != null) null else throw new RuntimeException ) → KILLED

186

1.1
Location : defaultIfMissing
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnABoolean(org.fissore.steroids.SteroidMapTest)
negated conditional → KILLED

187

1.1
Location : defaultIfMissing
Killed by : org.fissore.steroids.SteroidMapTest.shouldFailToCallMapsWithNonMaps(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::defaultIfMissing to ( if (x != null) null else throw new RuntimeException ) → KILLED

190

1.1
Location : defaultIfMissing
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnABoolean(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::defaultIfMissing to ( if (x != null) null else throw new RuntimeException ) → KILLED

200

1.1
Location : l
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnALong(org.fissore.steroids.SteroidMapTest)
replaced return of long value with value + 1 for org/fissore/steroids/SteroidMap::l → KILLED

211

1.1
Location : l
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnALong(org.fissore.steroids.SteroidMapTest)
replaced return of long value with value + 1 for org/fissore/steroids/SteroidMap::l → KILLED

221

1.1
Location : i
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAnInteger(org.fissore.steroids.SteroidMapTest)
replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED

232

1.1
Location : i
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAnInteger(org.fissore.steroids.SteroidMapTest)
replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED

242

1.1
Location : d
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnADouble(org.fissore.steroids.SteroidMapTest)
replaced return of double value with -(x + 1) for org/fissore/steroids/SteroidMap::d → KILLED

253

1.1
Location : d
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnADouble(org.fissore.steroids.SteroidMapTest)
replaced return of double value with -(x + 1) for org/fissore/steroids/SteroidMap::d → KILLED

263

1.1
Location : f
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAFloat(org.fissore.steroids.SteroidMapTest)
replaced return of float value with -(x + 1) for org/fissore/steroids/SteroidMap::f → KILLED

274

1.1
Location : f
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAFloat(org.fissore.steroids.SteroidMapTest)
replaced return of float value with -(x + 1) for org/fissore/steroids/SteroidMap::f → KILLED

284

1.1
Location : s
Killed by : org.fissore.steroids.SteroidMapTest.shouldNavigateSubKeys(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::s to ( if (x != null) null else throw new RuntimeException ) → KILLED

295

1.1
Location : s
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAString(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::s to ( if (x != null) null else throw new RuntimeException ) → KILLED

305

1.1
Location : b
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnABoolean(org.fissore.steroids.SteroidMapTest)
replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED

316

1.1
Location : b
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnABoolean(org.fissore.steroids.SteroidMapTest)
replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED

327

1.1
Location : o
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAnObject(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED

339

1.1
Location : o
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAnObject(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED

352

1.1
Location : o
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAnObject(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED

365

1.1
Location : o
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAnObject(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED

378

1.1
Location : lambda$o$3
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAnObject(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::lambda$o$3 to ( if (x != null) null else throw new RuntimeException ) → KILLED

2.2
Location : o
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAnObject(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::o to ( if (x != null) null else throw new RuntimeException ) → KILLED

388

1.1
Location : date
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnADate(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::date to ( if (x != null) null else throw new RuntimeException ) → KILLED

399

1.1
Location : date
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnADate(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::date to ( if (x != null) null else throw new RuntimeException ) → KILLED

409

1.1
Location : valued
Killed by : org.fissore.steroids.SteroidMapTest.shouldReportIfValuedNotValued(org.fissore.steroids.SteroidMapTest)
negated conditional → KILLED

2.2
Location : valued
Killed by : org.fissore.steroids.SteroidMapTest.shouldReportIfValuedNotValued(org.fissore.steroids.SteroidMapTest)
replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED

419

1.1
Location : notValued
Killed by : org.fissore.steroids.SteroidMapTest.shouldReportIfValuedNotValued(org.fissore.steroids.SteroidMapTest)
negated conditional → KILLED

2.2
Location : notValued
Killed by : org.fissore.steroids.SteroidMapTest.shouldReportIfValuedNotValued(org.fissore.steroids.SteroidMapTest)
replaced return of integer sized value with (x == 0 ? 1 : 0) → KILLED

431

1.1
Location : collection
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnACollection(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::collection to ( if (x != null) null else throw new RuntimeException ) → KILLED

443

1.1
Location : collection
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnACollection(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::collection to ( if (x != null) null else throw new RuntimeException ) → KILLED

455

1.1
Location : list
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAList(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::list to ( if (x != null) null else throw new RuntimeException ) → KILLED

467

1.1
Location : list
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAList(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::list to ( if (x != null) null else throw new RuntimeException ) → KILLED

479

1.1
Location : stream
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAStream(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::stream to ( if (x != null) null else throw new RuntimeException ) → KILLED

491

1.1
Location : stream
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAStream(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::stream to ( if (x != null) null else throw new RuntimeException ) → KILLED

502

1.1
Location : subMap
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnASubMapOfKeys(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::subMap to ( if (x != null) null else throw new RuntimeException ) → KILLED

513

1.1
Location : subMap
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnASubMapOfCollectionOfKeys(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::subMap to ( if (x != null) null else throw new RuntimeException ) → KILLED

533

1.1
Location : subMap
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnASubMapOfKeysWithSpecialMapImpl(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::subMap to ( if (x != null) null else throw new RuntimeException ) → KILLED

545

1.1
Location : subMap
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnASubMapOfCollectionOfKeysWithSpecialMapImpl(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::subMap to ( if (x != null) null else throw new RuntimeException ) → KILLED

573

1.1
Location : map
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnAMap(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::map to ( if (x != null) null else throw new RuntimeException ) → KILLED

583

1.1
Location : lambda$maps$4
Killed by : org.fissore.steroids.SteroidMapTest.shouldFailToCallMapsWithNonMaps(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::lambda$maps$4 to ( if (x != null) null else throw new RuntimeException ) → KILLED

2.2
Location : maps
Killed by : org.fissore.steroids.SteroidMapTest.shouldFailToCallMapsWithNonMaps(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::maps to ( if (x != null) null else throw new RuntimeException ) → KILLED

594

1.1
Location : maps
Killed by : org.fissore.steroids.SteroidMapTest.shouldReturnMaps(org.fissore.steroids.SteroidMapTest)
mutated return of Object value for org/fissore/steroids/SteroidMap::maps to ( if (x != null) null else throw new RuntimeException ) → KILLED

Active mutators

Tests examined


Report generated by PIT 1.4.6