free_mutant/lib/mutant/runner/sink.rb

114 lines
2.3 KiB
Ruby
Raw Normal View History

2014-10-23 11:37:53 +00:00
module Mutant
class Runner
# Abstract base class for computation sinks
2014-12-09 00:10:31 +00:00
class Sink
include AbstractType
2014-10-23 11:37:53 +00:00
# Return sink status
2014-10-23 11:37:53 +00:00
#
# @return [Object]
2014-10-23 11:37:53 +00:00
#
# @api private
#
abstract_method :status
2014-10-23 11:37:53 +00:00
# Test if computation should be stopped
2014-10-23 11:37:53 +00:00
#
# @return [Boolean]
#
# @api private
#
abstract_method :stop?
2014-10-23 11:37:53 +00:00
# Consume result
2014-10-23 11:37:53 +00:00
#
# @param [Object] result
2014-10-23 11:37:53 +00:00
#
# @return [self]
#
# @api private
#
abstract_method :result
2014-10-23 11:37:53 +00:00
# Mutation result sink
class Mutation < self
include Concord.new(:env)
2014-10-23 11:37:53 +00:00
# Initialize object
#
# @return [undefined]
#
# @api private
#
def initialize(*)
super
@start = Time.now
@subject_results = Hash.new do |_hash, subject|
Result::Subject.new(
subject: subject,
mutation_results: []
)
end
end
2014-10-23 11:37:53 +00:00
# Return runner status
#
# @return [Status]
#
# @api private
#
def status
env_result
end
2014-10-23 11:37:53 +00:00
# Test if scheduling stopped
#
# @return [Boolean]
#
# @api private
#
def stop?
env.config.fail_fast && !env_result.subject_results.all?(&:success?)
end
2014-10-23 11:37:53 +00:00
# Handle mutation finish
#
# @param [Result::Mutation] mutation_result
#
# @return [self]
#
# @api private
#
def result(mutation_result)
mutation = mutation_result.mutation
original = @subject_results[mutation.subject]
@subject_results[mutation.subject] = original.update(
mutation_results: (original.mutation_results.dup << mutation_result)
)
self
end
private
# Return current result
#
# @return [Result::Env]
#
# @api private
#
def env_result
Result::Env.new(
env: env,
runtime: Time.now - @start,
subject_results: @subject_results.values
)
end
2014-10-23 11:37:53 +00:00
end # Mutation
end # Sink
2014-10-23 11:37:53 +00:00
end # Runner
end # Mutant