2014-10-23 11:37:53 +00:00
|
|
|
module Mutant
|
|
|
|
class Runner
|
2014-12-22 16:27:10 +00:00
|
|
|
# Abstract base class for computation sinks
|
2014-12-09 00:10:31 +00:00
|
|
|
class Sink
|
2014-12-22 16:27:10 +00:00
|
|
|
include AbstractType
|
2014-10-23 11:37:53 +00:00
|
|
|
|
2014-12-22 16:27:10 +00:00
|
|
|
# Return sink status
|
2014-10-23 11:37:53 +00:00
|
|
|
#
|
2014-12-22 16:27:10 +00:00
|
|
|
# @return [Object]
|
2014-10-23 11:37:53 +00:00
|
|
|
#
|
|
|
|
# @api private
|
2014-12-22 16:27:10 +00:00
|
|
|
abstract_method :status
|
2014-10-23 11:37:53 +00:00
|
|
|
|
2014-12-22 16:27:10 +00:00
|
|
|
# Test if computation should be stopped
|
2014-10-23 11:37:53 +00:00
|
|
|
#
|
|
|
|
# @return [Boolean]
|
|
|
|
#
|
|
|
|
# @api private
|
2014-12-22 16:27:10 +00:00
|
|
|
abstract_method :stop?
|
2014-10-23 11:37:53 +00:00
|
|
|
|
2014-12-22 16:27:10 +00:00
|
|
|
# Consume result
|
2014-10-23 11:37:53 +00:00
|
|
|
#
|
2014-12-22 16:27:10 +00:00
|
|
|
# @param [Object] result
|
2014-10-23 11:37:53 +00:00
|
|
|
#
|
|
|
|
# @return [self]
|
|
|
|
#
|
|
|
|
# @api private
|
2014-12-22 16:27:10 +00:00
|
|
|
abstract_method :result
|
2014-10-23 11:37:53 +00:00
|
|
|
|
2014-12-22 16:27:10 +00:00
|
|
|
# Mutation result sink
|
|
|
|
class Mutation < self
|
|
|
|
include Concord.new(:env)
|
2014-10-23 11:37:53 +00:00
|
|
|
|
2014-12-22 16:27:10 +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,
|
2014-12-22 17:54:18 +00:00
|
|
|
tests: [],
|
2014-12-22 16:27:10 +00:00
|
|
|
mutation_results: []
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
2014-10-23 11:37:53 +00:00
|
|
|
|
2014-12-22 16:27:10 +00:00
|
|
|
# Return runner status
|
|
|
|
#
|
|
|
|
# @return [Status]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
def status
|
|
|
|
env_result
|
|
|
|
end
|
2014-10-23 11:37:53 +00:00
|
|
|
|
2014-12-22 16:27:10 +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
|
|
|
|
2014-12-22 16:27:10 +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(
|
2014-12-22 17:54:18 +00:00
|
|
|
mutation_results: (original.mutation_results.dup << mutation_result),
|
|
|
|
tests: mutation_result.test_result.tests
|
2014-12-22 16:27:10 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
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
|
|
|
|
2014-12-22 16:27:10 +00:00
|
|
|
end # Mutation
|
|
|
|
end # Sink
|
2014-10-23 11:37:53 +00:00
|
|
|
end # Runner
|
|
|
|
end # Mutant
|