Class: Evilution::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/evilution/runner.rb

Constant Summary collapse

INTEGRATIONS =
{
  rspec: Evilution::Integration::RSpec,
  minitest: Evilution::Integration::Minitest
}.freeze
PRELOAD_CANDIDATES =
[
  File.join("spec", "rails_helper.rb"),
  File.join("test", "test_helper.rb")
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config: Evilution::Config.new, on_result: nil, hooks: nil) ⇒ Runner

Returns a new instance of Runner.



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/evilution/runner.rb', line 43

def initialize(config: Evilution::Config.new, on_result: nil, hooks: nil)
  @config = config
  @on_result = on_result
  @hooks = hooks
  @parser = Evilution::AST::Parser.new
  @registry = Evilution::Mutator::Registry.default
  @cache = config.incremental? ? Evilution::Cache.new : nil
  @disable_detector = Evilution::DisableComment.new
  @disabled_ranges_cache = {}
  @sig_detector = Evilution::AST::SorbetSigDetector.new
  @sig_ranges_cache = {}
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



41
42
43
# File 'lib/evilution/runner.rb', line 41

def config
  @config
end

Instance Method Details

#callObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/evilution/runner.rb', line 56

def call
  install_signal_handlers
  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)

  subjects = parse_and_filter_subjects
  log_memory("after parse_subjects", "#{subjects.length} subjects")

  perform_preload
  log_memory("after preload") if rails_root_detected?

  baseline_result = run_baseline(subjects)

  mutations, skipped_count, disabled_mutations = generate_mutations(subjects)
  equivalent_mutations, mutations = filter_equivalent(mutations)
  release_subject_nodes(subjects)
  clear_operator_caches
  results, truncated = run_mutations(mutations, baseline_result)
  results += equivalent_mutations.map do |m|
    m.strip_sources!
    equivalent_result(m)
  end
  log_memory("after run_mutations", "#{results.length} results")

  duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time

  summary = Evilution::Result::Summary.new(results: results, duration: duration, truncated: truncated,
                                           skipped: skipped_count,
                                           disabled_mutations: disabled_mutations)
  output_report(summary)
  save_session(summary)

  summary
end

#parse_and_filter_subjectsObject



90
91
92
93
94
95
96
# File 'lib/evilution/runner.rb', line 90

def parse_and_filter_subjects
  subjects = parse_subjects
  subjects = filter_by_descendants(subjects) if descendants_target?
  subjects = filter_by_target(subjects) if method_target?
  subjects = (subjects) if config.line_ranges?
  subjects
end