free_mutant/lib/mutant/runner.rb

109 lines
2.2 KiB
Ruby
Raw Normal View History

2012-08-14 16:45:34 -04:00
module Mutant
# Runner that allows to mutate an entire project
2012-08-14 16:45:34 -04:00
class Runner
include Immutable
extend MethodObject
2012-08-14 16:45:34 -04:00
attr_reader :errors
2012-08-14 16:45:34 -04:00
def fail?
!errors.empty?
2012-08-14 16:45:34 -04:00
end
private
2012-08-14 16:45:34 -04:00
attr_reader :reporter
private :reporter
2012-08-14 16:45:34 -04:00
def initialize(options)
@killer = options.fetch(:killer) do
2012-08-14 16:45:34 -04:00
raise ArgumentError, 'Missing :killer in options'
end
@pattern = options.fetch(:pattern) do
2012-08-14 16:45:34 -04:00
raise ArgumentError, 'Missing :pattern in options'
end
@reporter = options.fetch(:reporter, Reporter::Null)
2012-08-14 16:45:34 -04:00
@errors = []
2012-08-14 16:45:34 -04:00
run
end
def run
@subjects = subjects.each do |subject|
reporter.subject(subject)
run_subject(subject)
2012-08-14 16:45:34 -04:00
end
end
def run_subject(subject)
subject.each do |mutation|
reporter.mutation(mutation)
kill(mutation)
2012-08-14 16:45:34 -04:00
end
subject.reset
2012-08-14 16:45:34 -04:00
end
def kill(mutation)
killer = @killer.run(mutation)
reporter.killer(killer)
if killer.fail?
@errors << killer
2012-08-14 16:45:34 -04:00
end
end
# Return candiate matcher enumerator
#
# @return [Enumerable<Class<Matcher>>]
#
# @api private
#
def candidate_matchers
[Matcher::Method::Singleton, Matcher::Method::Instance].each
2012-08-14 16:45:34 -04:00
end
# Return candidats enumerator
#
# @return [Enumerable<Object>]
#
# @api private
#
def candidates
return to_enum(__method__) unless block_given?
ObjectSpace.each_object(Module) do |candidate|
yield candidate if @pattern =~ candidate.name
2012-08-14 16:45:34 -04:00
end
end
# Return matcher enumerator
#
# @return [Enumerable<Matcher>]
#
# @api private
#
def matchers(&block)
return to_enum(__method__) unless block_given?
candidate_matchers.each do |candidate_matcher|
candidates.each do |candidate|
candidate_matcher.each(candidate,&block)
end
2012-08-14 16:45:34 -04:00
end
end
# Return subjects enumerator
#
# @return [Enumerable<Subject>]
#
# @api private
#
def subjects(&block)
return to_enum(__method__) unless block_given?
matchers.each do |matcher|
matcher.each(&block)
2012-08-14 16:45:34 -04:00
end
end
end
end