evilution 0.15.0 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.beads/.migration-hint-ts +1 -1
- data/.beads/issues.jsonl +32 -32
- data/CHANGELOG.md +27 -0
- data/lib/evilution/ast/source_surgeon.rb +3 -3
- data/lib/evilution/cli.rb +1 -0
- data/lib/evilution/config.rb +7 -1
- data/lib/evilution/mutator/operator/bang_method.rb +48 -0
- data/lib/evilution/mutator/operator/bitwise_complement.rb +31 -0
- data/lib/evilution/mutator/operator/bitwise_replacement.rb +30 -0
- data/lib/evilution/mutator/operator/break_statement.rb +50 -0
- data/lib/evilution/mutator/operator/class_variable_write.rb +25 -0
- data/lib/evilution/mutator/operator/collection_replacement.rb +25 -1
- data/lib/evilution/mutator/operator/ensure_removal.rb +27 -0
- data/lib/evilution/mutator/operator/explicit_super_mutation.rb +47 -0
- data/lib/evilution/mutator/operator/global_variable_write.rb +25 -0
- data/lib/evilution/mutator/operator/inline_rescue.rb +39 -0
- data/lib/evilution/mutator/operator/instance_variable_write.rb +25 -0
- data/lib/evilution/mutator/operator/local_variable_assignment.rb +16 -0
- data/lib/evilution/mutator/operator/next_statement.rb +50 -0
- data/lib/evilution/mutator/operator/redo_statement.rb +18 -0
- data/lib/evilution/mutator/operator/rescue_body_replacement.rb +94 -0
- data/lib/evilution/mutator/operator/rescue_removal.rb +37 -0
- data/lib/evilution/mutator/operator/send_mutation.rb +11 -2
- data/lib/evilution/mutator/operator/zsuper_removal.rb +16 -0
- data/lib/evilution/mutator/registry.rb +17 -1
- data/lib/evilution/reporter/progress_bar.rb +84 -0
- data/lib/evilution/reporter/suggestion.rb +225 -1
- data/lib/evilution/runner.rb +23 -11
- data/lib/evilution/version.rb +1 -1
- data/lib/evilution.rb +17 -0
- metadata +19 -2
|
@@ -26,7 +26,23 @@ class Evilution::Reporter::Suggestion
|
|
|
26
26
|
"argument_removal" => "Add a test that verifies the correct arguments are passed to this method call",
|
|
27
27
|
"compound_assignment" => "Add a test that verifies the side effect of this compound assignment (the accumulated value matters)",
|
|
28
28
|
"superclass_removal" => "Add a test that exercises inherited behavior from the superclass",
|
|
29
|
-
"mixin_removal" => "Add a test that exercises behavior provided by the included/extended module"
|
|
29
|
+
"mixin_removal" => "Add a test that exercises behavior provided by the included/extended module",
|
|
30
|
+
"local_variable_assignment" => "Add a test that depends on the assigned variable being stored, not just the value expression",
|
|
31
|
+
"instance_variable_write" => "Add a test that verifies the instance variable is set correctly, not just the return value",
|
|
32
|
+
"class_variable_write" => "Add a test that verifies the class variable is set correctly and affects shared state",
|
|
33
|
+
"global_variable_write" => "Add a test that verifies the global variable is set correctly, not just the value expression",
|
|
34
|
+
"rescue_removal" => "Add a test that triggers the rescued exception and verifies the rescue handler behavior",
|
|
35
|
+
"rescue_body_replacement" => "Add a test that triggers the rescued exception and verifies the rescue body produces the correct result",
|
|
36
|
+
"inline_rescue" => "Add a test that triggers the inline rescue and verifies the fallback value is used correctly",
|
|
37
|
+
"ensure_removal" => "Add a test that verifies the ensure cleanup code runs and its side effects are observable",
|
|
38
|
+
"break_statement" => "Add a test that verifies the break condition and the value returned when the loop exits early",
|
|
39
|
+
"next_statement" => "Add a test that verifies the next condition and the value yielded when the iteration skips",
|
|
40
|
+
"redo_statement" => "Add a test that verifies the redo restarts the iteration and the retry logic is necessary",
|
|
41
|
+
"bang_method" => "Add a test that distinguishes in-place mutation from copy semantics (bang vs non-bang)",
|
|
42
|
+
"bitwise_replacement" => "Add a test that checks the exact bitwise result to distinguish &, |, and ^ operators",
|
|
43
|
+
"bitwise_complement" => "Add a test that verifies the bitwise complement (~) result, not just the sign or magnitude",
|
|
44
|
+
"zsuper_removal" => "Add a test that verifies inherited behavior from super is needed, not just the subclass logic",
|
|
45
|
+
"explicit_super_mutation" => "Add a test that verifies the correct arguments are passed to super and the inherited result matters"
|
|
30
46
|
}.freeze
|
|
31
47
|
|
|
32
48
|
CONCRETE_TEMPLATES = {
|
|
@@ -305,6 +321,58 @@ class Evilution::Reporter::Suggestion
|
|
|
305
321
|
end
|
|
306
322
|
RSPEC
|
|
307
323
|
},
|
|
324
|
+
"local_variable_assignment" => lambda { |mutation|
|
|
325
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
326
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
327
|
+
<<~RSPEC.strip
|
|
328
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
329
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
330
|
+
it 'verifies the local variable assignment is used in ##{method_name}' do
|
|
331
|
+
# Assert that the assigned variable is read later, not just the value expression
|
|
332
|
+
result = subject.#{method_name}(input_value)
|
|
333
|
+
expect(result).to eq(expected)
|
|
334
|
+
end
|
|
335
|
+
RSPEC
|
|
336
|
+
},
|
|
337
|
+
"instance_variable_write" => lambda { |mutation|
|
|
338
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
339
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
340
|
+
<<~RSPEC.strip
|
|
341
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
342
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
343
|
+
it 'verifies the instance variable @state is set correctly in ##{method_name}' do
|
|
344
|
+
# Assert that the instance variable holds the expected value after the method runs
|
|
345
|
+
subject.#{method_name}(input_value)
|
|
346
|
+
expect(subject.instance_variable_get(:@variable)).to eq(expected)
|
|
347
|
+
end
|
|
348
|
+
RSPEC
|
|
349
|
+
},
|
|
350
|
+
"class_variable_write" => lambda { |mutation|
|
|
351
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
352
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
353
|
+
<<~RSPEC.strip
|
|
354
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
355
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
356
|
+
it 'verifies the class variable @@shared state is set correctly in ##{method_name}' do
|
|
357
|
+
# Assert that the class variable holds the expected value and affects shared state
|
|
358
|
+
subject.#{method_name}(input_value)
|
|
359
|
+
expect(described_class.class_variable_get(:@@variable)).to eq(expected)
|
|
360
|
+
end
|
|
361
|
+
RSPEC
|
|
362
|
+
},
|
|
363
|
+
"global_variable_write" => lambda { |mutation|
|
|
364
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
365
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
366
|
+
<<~RSPEC.strip
|
|
367
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
368
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
369
|
+
it 'verifies the global variable $state is set correctly in ##{method_name}' do
|
|
370
|
+
# Assert that the global variable holds the expected value after the method runs
|
|
371
|
+
subject.#{method_name}(input_value)
|
|
372
|
+
expect($variable).to eq(expected)
|
|
373
|
+
end
|
|
374
|
+
RSPEC
|
|
375
|
+
},
|
|
308
376
|
"mixin_removal" => lambda { |mutation|
|
|
309
377
|
method_name = parse_method_name(mutation.subject.name)
|
|
310
378
|
original_line, _mutated_line = extract_diff_lines(mutation.diff)
|
|
@@ -317,6 +385,162 @@ class Evilution::Reporter::Suggestion
|
|
|
317
385
|
expect(result).to eq(expected)
|
|
318
386
|
end
|
|
319
387
|
RSPEC
|
|
388
|
+
},
|
|
389
|
+
"rescue_removal" => lambda { |mutation|
|
|
390
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
391
|
+
original_line, _mutated_line = extract_diff_lines(mutation.diff)
|
|
392
|
+
<<~RSPEC.strip
|
|
393
|
+
# Mutation: removed `#{original_line}` in #{mutation.subject.name}
|
|
394
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
395
|
+
it 'verifies the rescue handler is needed in ##{method_name}' do
|
|
396
|
+
# Trigger the rescued exception and assert the handler's effect
|
|
397
|
+
result = subject.#{method_name}(input_that_raises)
|
|
398
|
+
expect(result).to eq(expected)
|
|
399
|
+
end
|
|
400
|
+
RSPEC
|
|
401
|
+
},
|
|
402
|
+
"rescue_body_replacement" => lambda { |mutation|
|
|
403
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
404
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
405
|
+
<<~RSPEC.strip
|
|
406
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
407
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
408
|
+
it 'verifies the rescue handler produces the correct result in ##{method_name}' do
|
|
409
|
+
# Trigger the exception and assert the rescue body's return value or side effect
|
|
410
|
+
result = subject.#{method_name}(input_that_raises)
|
|
411
|
+
expect(result).to eq(expected)
|
|
412
|
+
end
|
|
413
|
+
RSPEC
|
|
414
|
+
},
|
|
415
|
+
"inline_rescue" => lambda { |mutation|
|
|
416
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
417
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
418
|
+
<<~RSPEC.strip
|
|
419
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
420
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
421
|
+
it 'verifies the inline rescue fallback value in ##{method_name}' do
|
|
422
|
+
# Trigger the exception and assert the fallback value is correct
|
|
423
|
+
result = subject.#{method_name}(input_that_raises)
|
|
424
|
+
expect(result).to eq(expected)
|
|
425
|
+
end
|
|
426
|
+
RSPEC
|
|
427
|
+
},
|
|
428
|
+
"ensure_removal" => lambda { |mutation|
|
|
429
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
430
|
+
original_line, _mutated_line = extract_diff_lines(mutation.diff)
|
|
431
|
+
<<~RSPEC.strip
|
|
432
|
+
# Mutation: removed ensure block `#{original_line}` in #{mutation.subject.name}
|
|
433
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
434
|
+
it 'verifies the ensure cleanup runs in ##{method_name}' do
|
|
435
|
+
# Assert that the cleanup side effect is observable after the method runs
|
|
436
|
+
subject.#{method_name}(input_value)
|
|
437
|
+
expect(observable_cleanup_effect).to eq(expected)
|
|
438
|
+
end
|
|
439
|
+
RSPEC
|
|
440
|
+
},
|
|
441
|
+
"break_statement" => lambda { |mutation|
|
|
442
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
443
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
444
|
+
<<~RSPEC.strip
|
|
445
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
446
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
447
|
+
it 'verifies the break exits the loop correctly in ##{method_name}' do
|
|
448
|
+
# Assert the loop exits early and returns the expected value
|
|
449
|
+
result = subject.#{method_name}(input_value)
|
|
450
|
+
expect(result).to eq(expected)
|
|
451
|
+
end
|
|
452
|
+
RSPEC
|
|
453
|
+
},
|
|
454
|
+
"next_statement" => lambda { |mutation|
|
|
455
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
456
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
457
|
+
<<~RSPEC.strip
|
|
458
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
459
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
460
|
+
it 'verifies the next skips the iteration correctly in ##{method_name}' do
|
|
461
|
+
# Assert the iteration is skipped and the expected value is yielded
|
|
462
|
+
result = subject.#{method_name}(input_value)
|
|
463
|
+
expect(result).to eq(expected)
|
|
464
|
+
end
|
|
465
|
+
RSPEC
|
|
466
|
+
},
|
|
467
|
+
"redo_statement" => lambda { |mutation|
|
|
468
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
469
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
470
|
+
<<~RSPEC.strip
|
|
471
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
472
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
473
|
+
it 'verifies the redo retry logic is necessary in ##{method_name}' do
|
|
474
|
+
# Assert the iteration restart changes the outcome
|
|
475
|
+
result = subject.#{method_name}(input_value)
|
|
476
|
+
expect(result).to eq(expected)
|
|
477
|
+
end
|
|
478
|
+
RSPEC
|
|
479
|
+
},
|
|
480
|
+
"bitwise_replacement" => lambda { |mutation|
|
|
481
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
482
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
483
|
+
<<~RSPEC.strip
|
|
484
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
485
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
486
|
+
it 'verifies the exact bitwise result in ##{method_name}' do
|
|
487
|
+
# Assert the exact bit-level result to distinguish &, |, and ^ operators
|
|
488
|
+
result = subject.#{method_name}(input_value)
|
|
489
|
+
expect(result).to eq(expected)
|
|
490
|
+
end
|
|
491
|
+
RSPEC
|
|
492
|
+
},
|
|
493
|
+
"bitwise_complement" => lambda { |mutation|
|
|
494
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
495
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
496
|
+
<<~RSPEC.strip
|
|
497
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
498
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
499
|
+
it 'verifies the bitwise complement result in ##{method_name}' do
|
|
500
|
+
# Assert the exact complement (~) value, not just sign or magnitude
|
|
501
|
+
result = subject.#{method_name}(input_value)
|
|
502
|
+
expect(result).to eq(expected)
|
|
503
|
+
end
|
|
504
|
+
RSPEC
|
|
505
|
+
},
|
|
506
|
+
"bang_method" => lambda { |mutation|
|
|
507
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
508
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
509
|
+
<<~RSPEC.strip
|
|
510
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
511
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
512
|
+
it 'verifies in-place vs copy semantics matter in ##{method_name}' do
|
|
513
|
+
# Assert that the original object is or is not modified
|
|
514
|
+
result = subject.#{method_name}(input_value)
|
|
515
|
+
expect(result).to eq(expected)
|
|
516
|
+
end
|
|
517
|
+
RSPEC
|
|
518
|
+
},
|
|
519
|
+
"zsuper_removal" => lambda { |mutation|
|
|
520
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
521
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
522
|
+
<<~RSPEC.strip
|
|
523
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
524
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
525
|
+
it 'verifies inherited behavior from super is needed in ##{method_name}' do
|
|
526
|
+
# Assert that the result depends on the superclass implementation
|
|
527
|
+
result = subject.#{method_name}(input_value)
|
|
528
|
+
expect(result).to eq(expected)
|
|
529
|
+
end
|
|
530
|
+
RSPEC
|
|
531
|
+
},
|
|
532
|
+
"explicit_super_mutation" => lambda { |mutation|
|
|
533
|
+
method_name = parse_method_name(mutation.subject.name)
|
|
534
|
+
original_line, mutated_line = extract_diff_lines(mutation.diff)
|
|
535
|
+
<<~RSPEC.strip
|
|
536
|
+
# Mutation: changed `#{original_line}` to `#{mutated_line}` in #{mutation.subject.name}
|
|
537
|
+
# #{mutation.file_path}:#{mutation.line}
|
|
538
|
+
it 'verifies the correct arguments are passed to super in ##{method_name}' do
|
|
539
|
+
# Assert the inherited method receives the expected arguments
|
|
540
|
+
result = subject.#{method_name}(input_value)
|
|
541
|
+
expect(result).to eq(expected)
|
|
542
|
+
end
|
|
543
|
+
RSPEC
|
|
320
544
|
}
|
|
321
545
|
}.freeze
|
|
322
546
|
|
data/lib/evilution/runner.rb
CHANGED
|
@@ -201,11 +201,14 @@ class Evilution::Runner
|
|
|
201
201
|
end
|
|
202
202
|
|
|
203
203
|
def run_mutations(mutations, baseline_result = nil)
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
204
|
+
@progress_bar = build_progress_bar(mutations.length)
|
|
205
|
+
result = if config.jobs > 1
|
|
206
|
+
run_mutations_parallel(mutations, baseline_result)
|
|
207
|
+
else
|
|
208
|
+
run_mutations_sequential(mutations, baseline_result)
|
|
209
|
+
end
|
|
210
|
+
@progress_bar&.finish
|
|
211
|
+
result
|
|
209
212
|
end
|
|
210
213
|
|
|
211
214
|
def run_mutations_sequential(mutations, baseline_result = nil)
|
|
@@ -224,9 +227,7 @@ class Evilution::Runner
|
|
|
224
227
|
result = neutralize_if_baseline_failed(result, baseline_result, spec_resolver)
|
|
225
228
|
results << result
|
|
226
229
|
survived_count += 1 if result.survived?
|
|
227
|
-
|
|
228
|
-
log_progress(index + 1, result.status)
|
|
229
|
-
log_mutation_diagnostics(result)
|
|
230
|
+
notify_result(result, index + 1)
|
|
230
231
|
|
|
231
232
|
if config.fail_fast? && survived_count >= config.fail_fast
|
|
232
233
|
truncated = true
|
|
@@ -281,9 +282,7 @@ class Evilution::Runner
|
|
|
281
282
|
state[:results] << result
|
|
282
283
|
state[:survived_count] += 1 if result.survived?
|
|
283
284
|
state[:completed] += 1
|
|
284
|
-
|
|
285
|
-
log_progress(state[:completed], result.status)
|
|
286
|
-
log_mutation_diagnostics(result)
|
|
285
|
+
notify_result(result, state[:completed])
|
|
287
286
|
end
|
|
288
287
|
|
|
289
288
|
log_memory("after batch", "#{state[:completed]} complete")
|
|
@@ -447,6 +446,19 @@ class Evilution::Runner
|
|
|
447
446
|
warn "[evilution] failed to save session: #{e.message}" unless config.quiet
|
|
448
447
|
end
|
|
449
448
|
|
|
449
|
+
def notify_result(result, index)
|
|
450
|
+
on_result&.call(result)
|
|
451
|
+
@progress_bar&.tick(status: result.status)
|
|
452
|
+
log_progress(index, result.status)
|
|
453
|
+
log_mutation_diagnostics(result)
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
def build_progress_bar(total)
|
|
457
|
+
return nil if !config.progress? || config.quiet || config.verbose || !config.text? || !$stderr.tty?
|
|
458
|
+
|
|
459
|
+
Evilution::Reporter::ProgressBar.new(total: total, output: $stderr)
|
|
460
|
+
end
|
|
461
|
+
|
|
450
462
|
def build_reporter
|
|
451
463
|
case config.format
|
|
452
464
|
when :json
|
data/lib/evilution/version.rb
CHANGED
data/lib/evilution.rb
CHANGED
|
@@ -44,6 +44,22 @@ require_relative "evilution/mutator/operator/argument_nil_substitution"
|
|
|
44
44
|
require_relative "evilution/mutator/operator/compound_assignment"
|
|
45
45
|
require_relative "evilution/mutator/operator/mixin_removal"
|
|
46
46
|
require_relative "evilution/mutator/operator/superclass_removal"
|
|
47
|
+
require_relative "evilution/mutator/operator/local_variable_assignment"
|
|
48
|
+
require_relative "evilution/mutator/operator/instance_variable_write"
|
|
49
|
+
require_relative "evilution/mutator/operator/class_variable_write"
|
|
50
|
+
require_relative "evilution/mutator/operator/global_variable_write"
|
|
51
|
+
require_relative "evilution/mutator/operator/rescue_removal"
|
|
52
|
+
require_relative "evilution/mutator/operator/rescue_body_replacement"
|
|
53
|
+
require_relative "evilution/mutator/operator/inline_rescue"
|
|
54
|
+
require_relative "evilution/mutator/operator/ensure_removal"
|
|
55
|
+
require_relative "evilution/mutator/operator/break_statement"
|
|
56
|
+
require_relative "evilution/mutator/operator/next_statement"
|
|
57
|
+
require_relative "evilution/mutator/operator/redo_statement"
|
|
58
|
+
require_relative "evilution/mutator/operator/bang_method"
|
|
59
|
+
require_relative "evilution/mutator/operator/bitwise_replacement"
|
|
60
|
+
require_relative "evilution/mutator/operator/bitwise_complement"
|
|
61
|
+
require_relative "evilution/mutator/operator/zsuper_removal"
|
|
62
|
+
require_relative "evilution/mutator/operator/explicit_super_mutation"
|
|
47
63
|
require_relative "evilution/mutator/registry"
|
|
48
64
|
require_relative "evilution/equivalent"
|
|
49
65
|
require_relative "evilution/equivalent/heuristic"
|
|
@@ -66,6 +82,7 @@ require_relative "evilution/reporter/json"
|
|
|
66
82
|
require_relative "evilution/reporter/cli"
|
|
67
83
|
require_relative "evilution/reporter/html"
|
|
68
84
|
require_relative "evilution/reporter/suggestion"
|
|
85
|
+
require_relative "evilution/reporter/progress_bar"
|
|
69
86
|
require_relative "evilution/spec_resolver"
|
|
70
87
|
require_relative "evilution/baseline"
|
|
71
88
|
require_relative "evilution/cache"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: evilution
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.16.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Denis Kiselev
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-03-
|
|
11
|
+
date: 2026-03-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: diff-lcs
|
|
@@ -119,32 +119,48 @@ files:
|
|
|
119
119
|
- lib/evilution/mutator/operator/argument_removal.rb
|
|
120
120
|
- lib/evilution/mutator/operator/arithmetic_replacement.rb
|
|
121
121
|
- lib/evilution/mutator/operator/array_literal.rb
|
|
122
|
+
- lib/evilution/mutator/operator/bang_method.rb
|
|
123
|
+
- lib/evilution/mutator/operator/bitwise_complement.rb
|
|
124
|
+
- lib/evilution/mutator/operator/bitwise_replacement.rb
|
|
122
125
|
- lib/evilution/mutator/operator/block_removal.rb
|
|
123
126
|
- lib/evilution/mutator/operator/boolean_literal_replacement.rb
|
|
124
127
|
- lib/evilution/mutator/operator/boolean_operator_replacement.rb
|
|
128
|
+
- lib/evilution/mutator/operator/break_statement.rb
|
|
129
|
+
- lib/evilution/mutator/operator/class_variable_write.rb
|
|
125
130
|
- lib/evilution/mutator/operator/collection_replacement.rb
|
|
126
131
|
- lib/evilution/mutator/operator/comparison_replacement.rb
|
|
127
132
|
- lib/evilution/mutator/operator/compound_assignment.rb
|
|
128
133
|
- lib/evilution/mutator/operator/conditional_branch.rb
|
|
129
134
|
- lib/evilution/mutator/operator/conditional_flip.rb
|
|
130
135
|
- lib/evilution/mutator/operator/conditional_negation.rb
|
|
136
|
+
- lib/evilution/mutator/operator/ensure_removal.rb
|
|
137
|
+
- lib/evilution/mutator/operator/explicit_super_mutation.rb
|
|
131
138
|
- lib/evilution/mutator/operator/float_literal.rb
|
|
139
|
+
- lib/evilution/mutator/operator/global_variable_write.rb
|
|
132
140
|
- lib/evilution/mutator/operator/hash_literal.rb
|
|
141
|
+
- lib/evilution/mutator/operator/inline_rescue.rb
|
|
142
|
+
- lib/evilution/mutator/operator/instance_variable_write.rb
|
|
133
143
|
- lib/evilution/mutator/operator/integer_literal.rb
|
|
144
|
+
- lib/evilution/mutator/operator/local_variable_assignment.rb
|
|
134
145
|
- lib/evilution/mutator/operator/method_body_replacement.rb
|
|
135
146
|
- lib/evilution/mutator/operator/method_call_removal.rb
|
|
136
147
|
- lib/evilution/mutator/operator/mixin_removal.rb
|
|
137
148
|
- lib/evilution/mutator/operator/negation_insertion.rb
|
|
149
|
+
- lib/evilution/mutator/operator/next_statement.rb
|
|
138
150
|
- lib/evilution/mutator/operator/nil_replacement.rb
|
|
139
151
|
- lib/evilution/mutator/operator/range_replacement.rb
|
|
140
152
|
- lib/evilution/mutator/operator/receiver_replacement.rb
|
|
153
|
+
- lib/evilution/mutator/operator/redo_statement.rb
|
|
141
154
|
- lib/evilution/mutator/operator/regexp_mutation.rb
|
|
155
|
+
- lib/evilution/mutator/operator/rescue_body_replacement.rb
|
|
156
|
+
- lib/evilution/mutator/operator/rescue_removal.rb
|
|
142
157
|
- lib/evilution/mutator/operator/return_value_removal.rb
|
|
143
158
|
- lib/evilution/mutator/operator/send_mutation.rb
|
|
144
159
|
- lib/evilution/mutator/operator/statement_deletion.rb
|
|
145
160
|
- lib/evilution/mutator/operator/string_literal.rb
|
|
146
161
|
- lib/evilution/mutator/operator/superclass_removal.rb
|
|
147
162
|
- lib/evilution/mutator/operator/symbol_literal.rb
|
|
163
|
+
- lib/evilution/mutator/operator/zsuper_removal.rb
|
|
148
164
|
- lib/evilution/mutator/registry.rb
|
|
149
165
|
- lib/evilution/parallel.rb
|
|
150
166
|
- lib/evilution/parallel/pool.rb
|
|
@@ -152,6 +168,7 @@ files:
|
|
|
152
168
|
- lib/evilution/reporter/cli.rb
|
|
153
169
|
- lib/evilution/reporter/html.rb
|
|
154
170
|
- lib/evilution/reporter/json.rb
|
|
171
|
+
- lib/evilution/reporter/progress_bar.rb
|
|
155
172
|
- lib/evilution/reporter/suggestion.rb
|
|
156
173
|
- lib/evilution/result.rb
|
|
157
174
|
- lib/evilution/result/mutation_result.rb
|