241 lines
7.1 KiB
Ruby
241 lines
7.1 KiB
Ruby
require 'stringio'
|
|
require 'set'
|
|
require 'adamantium'
|
|
require 'ice_nine'
|
|
require 'abstract_type'
|
|
require 'equalizer'
|
|
require 'digest/sha1'
|
|
require 'inflecto'
|
|
require 'parser'
|
|
require 'parser/current'
|
|
require 'parser_extensions'
|
|
require 'unparser'
|
|
require 'ice_nine'
|
|
require 'diff/lcs'
|
|
require 'diff/lcs/hunk'
|
|
require 'anima'
|
|
require 'concord'
|
|
require 'morpher'
|
|
require 'parallel'
|
|
|
|
# Library namespace
|
|
module Mutant
|
|
# The frozen empty string used within mutant
|
|
EMPTY_STRING = ''.freeze
|
|
# The frozen empty array used within mutant
|
|
EMPTY_ARRAY = [].freeze
|
|
|
|
symbolset = ->(strings) { strings.map(&:to_sym).to_set.freeze }
|
|
|
|
SCOPE_OPERATOR = '::'.freeze
|
|
|
|
# Set of nodes that cannot be on the LHS of an assignment
|
|
NOT_ASSIGNABLE = symbolset.(%w[int float str dstr class module self nil])
|
|
# Set of op-assign types
|
|
OP_ASSIGN = symbolset.call(%w[or_asgn and_asgn op_asgn])
|
|
# Set of node types that are not valid when emitted standalone
|
|
NOT_STANDALONE = symbolset.(%w[splat restarg block_pass])
|
|
INDEX_OPERATORS = symbolset.(%w[[] []=])
|
|
UNARY_METHOD_OPERATORS = symbolset.(%w[~@ +@ -@ !])
|
|
|
|
# Operators ruby implementeds as methods
|
|
METHOD_OPERATORS = symbolset.(%w[
|
|
<=> === []= [] <= >= == !~ != =~ <<
|
|
>> ** * % / | ^ & < > + - ~@ +@ -@ !
|
|
])
|
|
|
|
BINARY_METHOD_OPERATORS = (
|
|
METHOD_OPERATORS - (INDEX_OPERATORS + UNARY_METHOD_OPERATORS)
|
|
).to_set.freeze
|
|
|
|
OPERATOR_METHODS = (
|
|
METHOD_OPERATORS + INDEX_OPERATORS + UNARY_METHOD_OPERATORS
|
|
).to_set.freeze
|
|
|
|
# Nodes that are NOT handled by mutant.
|
|
#
|
|
# not - 1.8 only, mutant does not support 1.8
|
|
#
|
|
NODE_BLACKLIST = symbolset.(%w[not])
|
|
|
|
# Nodes that are NOT generated by parser but used by mutant / unparser.
|
|
NODE_EXTRA = symbolset.(%w[empty])
|
|
|
|
# All node types mutant handles
|
|
NODE_TYPES = ((Parser::Meta::NODE_TYPES + NODE_EXTRA) - NODE_BLACKLIST).to_set.freeze
|
|
|
|
# Lookup constant for location
|
|
#
|
|
# @param [String] location
|
|
#
|
|
# @return [Object]
|
|
#
|
|
# @api private
|
|
#
|
|
def self.constant_lookup(location)
|
|
location.split(SCOPE_OPERATOR).reduce(Object) do |parent, name|
|
|
parent.const_get(name, nil)
|
|
end
|
|
end
|
|
|
|
# Perform self zombification
|
|
#
|
|
# @return [self]
|
|
#
|
|
# @api private
|
|
#
|
|
def self.zombify
|
|
Zombifier.run('mutant', :Zombie)
|
|
self
|
|
end
|
|
|
|
# Define instance of subclassed superclass as constant
|
|
#
|
|
# @param [Class] superclass
|
|
# @param [Symbol] name
|
|
#
|
|
# @return [self]
|
|
#
|
|
# @api private
|
|
#
|
|
def self.singleton_subclass_instance(name, superclass, &block)
|
|
klass = Class.new(superclass) do
|
|
def inspect
|
|
self.class.name
|
|
end
|
|
|
|
define_singleton_method(:name) do
|
|
"#{superclass.name}::#{name}".freeze
|
|
end
|
|
end
|
|
klass.class_eval(&block)
|
|
superclass.const_set(name, klass.new)
|
|
self
|
|
end
|
|
|
|
end # Mutant
|
|
|
|
require 'mutant/version'
|
|
require 'mutant/cache'
|
|
require 'mutant/delegator'
|
|
require 'mutant/node_helpers'
|
|
require 'mutant/warning_filter'
|
|
require 'mutant/warning_expectation'
|
|
require 'mutant/walker'
|
|
require 'mutant/require_highjack'
|
|
require 'mutant/isolation'
|
|
require 'mutant/mutator'
|
|
require 'mutant/mutation'
|
|
require 'mutant/mutation/evil'
|
|
require 'mutant/mutation/neutral'
|
|
require 'mutant/mutator/registry'
|
|
require 'mutant/mutator/util'
|
|
require 'mutant/mutator/util/array'
|
|
require 'mutant/mutator/util/symbol'
|
|
require 'mutant/mutator/node'
|
|
require 'mutant/mutator/node/generic'
|
|
require 'mutant/mutator/node/literal'
|
|
require 'mutant/mutator/node/literal/boolean'
|
|
require 'mutant/mutator/node/literal/range'
|
|
require 'mutant/mutator/node/literal/symbol'
|
|
require 'mutant/mutator/node/literal/string'
|
|
require 'mutant/mutator/node/literal/fixnum'
|
|
require 'mutant/mutator/node/literal/float'
|
|
require 'mutant/mutator/node/literal/array'
|
|
require 'mutant/mutator/node/literal/hash'
|
|
require 'mutant/mutator/node/literal/regex'
|
|
require 'mutant/mutator/node/literal/nil'
|
|
require 'mutant/mutator/node/argument'
|
|
require 'mutant/mutator/node/arguments'
|
|
require 'mutant/mutator/node/blockarg'
|
|
require 'mutant/mutator/node/begin'
|
|
require 'mutant/mutator/node/binary'
|
|
require 'mutant/mutator/node/const'
|
|
require 'mutant/mutator/node/dstr'
|
|
require 'mutant/mutator/node/dsym'
|
|
require 'mutant/mutator/node/kwbegin'
|
|
require 'mutant/mutator/node/named_value/access'
|
|
require 'mutant/mutator/node/named_value/constant_assignment'
|
|
require 'mutant/mutator/node/named_value/variable_assignment'
|
|
require 'mutant/mutator/node/next'
|
|
require 'mutant/mutator/node/break'
|
|
require 'mutant/mutator/node/noop'
|
|
require 'mutant/mutator/node/or_asgn'
|
|
require 'mutant/mutator/node/and_asgn'
|
|
require 'mutant/mutator/node/defined'
|
|
require 'mutant/mutator/node/op_asgn'
|
|
require 'mutant/mutator/node/conditional_loop'
|
|
require 'mutant/mutator/node/yield'
|
|
require 'mutant/mutator/node/super'
|
|
require 'mutant/mutator/node/zsuper'
|
|
require 'mutant/mutator/node/restarg'
|
|
require 'mutant/mutator/node/send'
|
|
require 'mutant/mutator/node/send/binary'
|
|
require 'mutant/mutator/node/send/attribute_assignment'
|
|
require 'mutant/mutator/node/send/index'
|
|
require 'mutant/mutator/node/when'
|
|
require 'mutant/mutator/node/define'
|
|
require 'mutant/mutator/node/mlhs'
|
|
require 'mutant/mutator/node/nthref'
|
|
require 'mutant/mutator/node/masgn'
|
|
require 'mutant/mutator/node/return'
|
|
require 'mutant/mutator/node/block'
|
|
require 'mutant/mutator/node/if'
|
|
require 'mutant/mutator/node/case'
|
|
require 'mutant/mutator/node/splat'
|
|
require 'mutant/mutator/node/resbody'
|
|
require 'mutant/mutator/node/rescue'
|
|
require 'mutant/mutator/node/match_current_line'
|
|
require 'mutant/config'
|
|
require 'mutant/loader'
|
|
require 'mutant/context'
|
|
require 'mutant/context/scope'
|
|
require 'mutant/subject'
|
|
require 'mutant/subject/method'
|
|
require 'mutant/subject/method/instance'
|
|
require 'mutant/subject/method/singleton'
|
|
require 'mutant/matcher'
|
|
require 'mutant/matcher/builder'
|
|
require 'mutant/matcher/chain'
|
|
require 'mutant/matcher/method'
|
|
require 'mutant/matcher/method/finder'
|
|
require 'mutant/matcher/method/singleton'
|
|
require 'mutant/matcher/method/instance'
|
|
require 'mutant/matcher/methods'
|
|
require 'mutant/matcher/namespace'
|
|
require 'mutant/matcher/scope'
|
|
require 'mutant/matcher/filter'
|
|
require 'mutant/matcher/null'
|
|
require 'mutant/expression'
|
|
require 'mutant/expression/method'
|
|
require 'mutant/expression/methods'
|
|
require 'mutant/expression/namespace'
|
|
require 'mutant/killer'
|
|
require 'mutant/test'
|
|
require 'mutant/test/report'
|
|
require 'mutant/integration'
|
|
require 'mutant/runner'
|
|
require 'mutant/runner/config'
|
|
require 'mutant/runner/subject'
|
|
require 'mutant/runner/mutation'
|
|
require 'mutant/runner/killer'
|
|
require 'mutant/cli'
|
|
require 'mutant/color'
|
|
require 'mutant/diff'
|
|
require 'mutant/reporter'
|
|
require 'mutant/reporter/null'
|
|
require 'mutant/reporter/trace'
|
|
require 'mutant/reporter/cli'
|
|
require 'mutant/reporter/cli/registry'
|
|
require 'mutant/reporter/cli/printer'
|
|
require 'mutant/reporter/cli/report'
|
|
require 'mutant/reporter/cli/report/config'
|
|
require 'mutant/reporter/cli/report/subject'
|
|
require 'mutant/reporter/cli/report/mutation'
|
|
require 'mutant/reporter/cli/progress'
|
|
require 'mutant/reporter/cli/progress/config'
|
|
require 'mutant/reporter/cli/progress/subject'
|
|
require 'mutant/reporter/cli/progress/mutation'
|
|
require 'mutant/reporter/cli/progress/noop'
|
|
require 'mutant/zombifier'
|
|
require 'mutant/zombifier/file'
|