Class: ActiveMutator::Runner
- Inherits:
-
Object
- Object
- ActiveMutator::Runner
- Defined in:
- lib/active_mutator/runner.rb
Instance Method Summary collapse
- #call ⇒ Object
- #exit_code(results) ⇒ Object
-
#initialize(config, reporter: nil) ⇒ Runner
constructor
A new instance of Runner.
-
#plan_work(mutations, map, ledger: nil, fingerprints: {}) ⇒ Object
Returns [work_items, pre_results].
Constructor Details
#initialize(config, reporter: nil) ⇒ Runner
Returns a new instance of Runner.
3 4 5 6 |
# File 'lib/active_mutator/runner.rb', line 3 def initialize(config, reporter: nil) @config = config @reporter = reporter || build_reporter end |
Instance Method Details
#call ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/active_mutator/runner.rb', line 8 def call ENV["ACTIVE_MUTATOR"] = "1" preload! preload_spec_helper! map = Baseline.new(root: @config.root).coverage_map(force: @config.force_baseline) subjects = discover_subjects analyses = subjects.map { |s| Engine.new.analyze(s) } mutations = analyses.flat_map(&:mutations) invalid_count = analyses.sum(&:invalid_count) fingerprints = Fingerprint.for_mutations(mutations, root: @config.root) ledger = AcceptedLedger.load(@config.root) warn_stale(ledger, fingerprints.values) items, pre_results = plan_work(mutations, map, ledger: ledger, fingerprints: fingerprints) pre_results.each { |r| @reporter.on_result(r) } scheduler = Scheduler.new(jobs: @config.jobs, on_result: @reporter.method(:on_result)) results = scheduler.run(items) + pre_results accept_survivors!(ledger, results, fingerprints) if @config.accept_survivors @reporter.summary(results, invalid_count: invalid_count) exit_code(results) end |
#exit_code(results) ⇒ Object
55 56 57 |
# File 'lib/active_mutator/runner.rb', line 55 def exit_code(results) results.any? { |r| r.status == :survived } ? 1 : 0 end |
#plan_work(mutations, map, ledger: nil, fingerprints: {}) ⇒ Object
Returns [work_items, pre_results]. Public for unit testing.
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/active_mutator/runner.rb', line 34 def plan_work(mutations, map, ledger: nil, fingerprints: {}) items = [] pre_results = [] mutations.each do |mutation| if ledger&.accepted?(fingerprints[mutation]) pre_results << Result.new(mutation: mutation, status: :accepted, details: nil) next end example_ids = map.examples_for(mutation.subject.file, mutation.lines) if example_ids.empty? pre_results << Result.new(mutation: mutation, status: :uncovered, details: nil) else lane = example_ids.any? { |id| serial_example?(id) } ? :serial : :parallel timeout = map.time_for(example_ids) * @config.timeout_factor + @config.timeout_floor timeout += @config.browser_boot_seconds if lane == :serial items << WorkItem.new(mutation: mutation, example_ids: example_ids, timeout: timeout, lane: lane) end end [items, pre_results] end |