2013-07-28 19:03:06 -04:00
|
|
|
# encoding: utf-8
|
|
|
|
|
2013-12-19 10:47:12 -05:00
|
|
|
require 'stringio'
|
2013-01-03 10:52:42 -05:00
|
|
|
require 'set'
|
2012-10-15 08:36:15 -04:00
|
|
|
require 'adamantium'
|
2012-08-28 13:15:10 -04:00
|
|
|
require 'ice_nine'
|
2012-11-26 06:16:22 -05:00
|
|
|
require 'abstract_type'
|
2012-09-15 17:04:10 -04:00
|
|
|
require 'equalizer'
|
2012-11-21 16:28:08 -05:00
|
|
|
require 'digest/sha1'
|
2013-01-22 10:05:56 -05:00
|
|
|
require 'inflecto'
|
2013-05-21 20:40:50 -04:00
|
|
|
require 'parser'
|
2013-06-04 13:22:33 -04:00
|
|
|
require 'parser/current'
|
2014-04-22 13:01:18 -04:00
|
|
|
require 'parser_extensions'
|
2013-05-21 20:40:50 -04:00
|
|
|
require 'unparser'
|
2012-07-31 16:01:55 -04:00
|
|
|
require 'ice_nine'
|
2012-08-16 12:02:03 -04:00
|
|
|
require 'diff/lcs'
|
|
|
|
require 'diff/lcs/hunk'
|
2013-02-24 14:40:23 -05:00
|
|
|
require 'anima'
|
2013-03-24 11:43:40 -04:00
|
|
|
require 'concord'
|
2014-02-02 16:48:08 -05:00
|
|
|
require 'morpher'
|
2012-07-27 16:39:31 -04:00
|
|
|
|
2012-07-23 16:54:35 -04:00
|
|
|
# Library namespace
|
|
|
|
module Mutant
|
2014-03-30 10:56:51 -04:00
|
|
|
# The frozen empty string used within mutant
|
2013-07-21 16:19:41 -04:00
|
|
|
EMPTY_STRING = ''.freeze
|
2014-03-30 10:56:51 -04:00
|
|
|
# The frozen empty array used within mutant
|
|
|
|
EMPTY_ARRAY = [].freeze
|
2014-04-04 10:14:24 -04:00
|
|
|
|
|
|
|
# Perform self zombification
|
|
|
|
#
|
|
|
|
# @return [self]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
#
|
|
|
|
def self.zombify
|
|
|
|
Zombifier.run('mutant', :Zombie)
|
|
|
|
self
|
|
|
|
end
|
|
|
|
|
2014-05-09 19:15:25 -04:00
|
|
|
IsolationError = Class.new(RuntimeError)
|
|
|
|
|
|
|
|
# Call block in isolation
|
|
|
|
#
|
|
|
|
# This isolation implements the fork strategy.
|
|
|
|
# Future strategies will probably use a process pool that can
|
|
|
|
# handle multiple mutation kills, in-isolation at once.
|
|
|
|
#
|
|
|
|
# @return [Object]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
#
|
|
|
|
def self.isolate(&block)
|
|
|
|
reader, writer = IO.pipe
|
|
|
|
|
|
|
|
pid = fork do
|
|
|
|
reader.close
|
|
|
|
writer.write(Marshal.dump(block.call))
|
|
|
|
end
|
|
|
|
|
|
|
|
writer.close
|
|
|
|
|
|
|
|
begin
|
|
|
|
data = Marshal.load(reader.read)
|
2014-05-11 10:38:07 -04:00
|
|
|
rescue ArgumentError
|
2014-05-09 19:15:25 -04:00
|
|
|
raise IsolationError, 'Childprocess wrote unmarshallable data'
|
|
|
|
end
|
|
|
|
|
|
|
|
status = Process.waitpid2(pid).last
|
|
|
|
|
2014-05-11 10:48:26 -04:00
|
|
|
unless status.exitstatus.zero?
|
|
|
|
raise IsolationError, "Childprocess exited with nonzero exit status: #{status.exitstatus}"
|
|
|
|
end
|
2014-05-09 19:15:25 -04:00
|
|
|
|
|
|
|
data
|
|
|
|
end
|
|
|
|
|
2014-04-20 17:01:03 -04:00
|
|
|
# Return a frozen set of symbols from string enumerable
|
|
|
|
#
|
|
|
|
# @param [Enumerable<String>]
|
|
|
|
#
|
|
|
|
# @return [Set<Symbol>]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
#
|
|
|
|
def self.symbolset(strings)
|
|
|
|
strings.map(&:to_sym).to_set.freeze
|
|
|
|
end
|
|
|
|
private_class_method :symbolset
|
|
|
|
|
|
|
|
# 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
|
|
|
|
|
2013-07-21 16:19:41 -04:00
|
|
|
end # Mutant
|
2012-07-23 16:54:35 -04:00
|
|
|
|
2013-08-02 19:44:58 -04:00
|
|
|
require 'mutant/version'
|
2013-06-27 16:18:07 -04:00
|
|
|
require 'mutant/cache'
|
2013-06-04 13:22:33 -04:00
|
|
|
require 'mutant/node_helpers'
|
2014-03-29 16:18:23 -04:00
|
|
|
require 'mutant/warning_filter'
|
2014-04-22 14:40:23 -04:00
|
|
|
require 'mutant/warning_expectation'
|
2013-01-03 18:18:48 -05:00
|
|
|
require 'mutant/constants'
|
2014-01-18 17:53:07 -05:00
|
|
|
require 'mutant/walker'
|
2014-04-04 08:38:06 -04:00
|
|
|
require 'mutant/require_highjack'
|
2012-07-26 13:25:23 -04:00
|
|
|
require 'mutant/mutator'
|
2012-08-15 22:09:14 -04:00
|
|
|
require 'mutant/mutation'
|
2013-01-15 17:46:05 -05:00
|
|
|
require 'mutant/mutation/evil'
|
|
|
|
require 'mutant/mutation/neutral'
|
2012-08-01 07:27:35 -04:00
|
|
|
require 'mutant/mutator/registry'
|
2012-12-06 14:44:26 -05:00
|
|
|
require 'mutant/mutator/util'
|
2012-12-29 14:12:48 -05:00
|
|
|
require 'mutant/mutator/util/array'
|
|
|
|
require 'mutant/mutator/util/symbol'
|
2012-12-06 15:30:28 -05:00
|
|
|
require 'mutant/mutator/node'
|
2013-07-04 19:21:07 -04:00
|
|
|
require 'mutant/mutator/node/generic'
|
2012-12-06 15:30:28 -05:00
|
|
|
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'
|
2013-06-04 17:44:17 -04:00
|
|
|
require 'mutant/mutator/node/argument'
|
|
|
|
require 'mutant/mutator/node/arguments'
|
2013-09-09 02:08:44 -04:00
|
|
|
require 'mutant/mutator/node/blockarg'
|
2013-06-04 16:16:04 -04:00
|
|
|
require 'mutant/mutator/node/begin'
|
2013-12-29 17:04:28 -05:00
|
|
|
require 'mutant/mutator/node/binary'
|
2013-07-24 00:57:39 -04:00
|
|
|
require 'mutant/mutator/node/const'
|
2013-09-08 00:28:37 -04:00
|
|
|
require 'mutant/mutator/node/dstr'
|
2013-09-08 11:17:47 -04:00
|
|
|
require 'mutant/mutator/node/dsym'
|
2013-11-03 23:51:55 -05:00
|
|
|
require 'mutant/mutator/node/kwbegin'
|
2013-07-23 02:54:54 -04:00
|
|
|
require 'mutant/mutator/node/named_value/access'
|
2013-07-23 03:23:21 -04:00
|
|
|
require 'mutant/mutator/node/named_value/constant_assignment'
|
2013-07-23 03:03:57 -04:00
|
|
|
require 'mutant/mutator/node/named_value/variable_assignment'
|
2013-11-20 14:25:17 -05:00
|
|
|
require 'mutant/mutator/node/loop_control'
|
2013-07-28 16:25:43 -04:00
|
|
|
require 'mutant/mutator/node/noop'
|
2013-09-08 02:03:25 -04:00
|
|
|
require 'mutant/mutator/node/op_asgn'
|
2013-12-29 16:32:26 -05:00
|
|
|
require 'mutant/mutator/node/conditional_loop'
|
2013-11-03 15:37:47 -05:00
|
|
|
require 'mutant/mutator/node/yield'
|
2013-01-01 17:28:21 -05:00
|
|
|
require 'mutant/mutator/node/super'
|
2013-07-23 04:02:29 -04:00
|
|
|
require 'mutant/mutator/node/zsuper'
|
2013-09-07 22:49:55 -04:00
|
|
|
require 'mutant/mutator/node/restarg'
|
2012-12-06 15:30:28 -05:00
|
|
|
require 'mutant/mutator/node/send'
|
2013-06-14 13:53:55 -04:00
|
|
|
require 'mutant/mutator/node/send/binary'
|
2014-04-22 13:01:46 -04:00
|
|
|
require 'mutant/mutator/node/send/attribute_assignment'
|
|
|
|
require 'mutant/mutator/node/send/index'
|
2013-01-04 16:16:03 -05:00
|
|
|
require 'mutant/mutator/node/when'
|
2012-12-06 15:30:28 -05:00
|
|
|
require 'mutant/mutator/node/define'
|
2013-06-14 14:19:53 -04:00
|
|
|
require 'mutant/mutator/node/mlhs'
|
2013-08-02 19:36:13 -04:00
|
|
|
require 'mutant/mutator/node/nthref'
|
2013-07-05 07:44:13 -04:00
|
|
|
require 'mutant/mutator/node/masgn'
|
2012-12-06 15:30:28 -05:00
|
|
|
require 'mutant/mutator/node/return'
|
2013-06-14 14:19:53 -04:00
|
|
|
require 'mutant/mutator/node/block'
|
2013-01-04 16:16:03 -05:00
|
|
|
require 'mutant/mutator/node/if'
|
2013-06-14 12:22:34 -04:00
|
|
|
require 'mutant/mutator/node/case'
|
2013-07-15 16:25:09 -04:00
|
|
|
require 'mutant/mutator/node/splat'
|
2013-12-01 16:42:52 -05:00
|
|
|
require 'mutant/mutator/node/resbody'
|
2014-03-22 20:33:45 -04:00
|
|
|
require 'mutant/mutator/node/rescue'
|
2014-04-22 13:24:31 -04:00
|
|
|
require 'mutant/mutator/node/match_current_line'
|
2013-04-17 23:31:21 -04:00
|
|
|
require 'mutant/config'
|
|
|
|
require 'mutant/loader'
|
2012-07-26 13:25:23 -04:00
|
|
|
require 'mutant/context'
|
2012-08-15 22:10:54 -04:00
|
|
|
require 'mutant/context/scope'
|
2012-08-01 12:34:03 -04:00
|
|
|
require 'mutant/subject'
|
2013-01-13 16:25:49 -05:00
|
|
|
require 'mutant/subject/method'
|
2013-07-04 18:54:50 -04:00
|
|
|
require 'mutant/subject/method/instance'
|
|
|
|
require 'mutant/subject/method/singleton'
|
2012-07-23 16:54:35 -04:00
|
|
|
require 'mutant/matcher'
|
2012-08-28 13:15:10 -04:00
|
|
|
require 'mutant/matcher/chain'
|
2012-07-23 16:54:35 -04:00
|
|
|
require 'mutant/matcher/method'
|
2013-06-27 16:18:07 -04:00
|
|
|
require 'mutant/matcher/method/finder'
|
2012-07-23 16:54:35 -04:00
|
|
|
require 'mutant/matcher/method/singleton'
|
|
|
|
require 'mutant/matcher/method/instance'
|
2013-01-21 14:08:30 -05:00
|
|
|
require 'mutant/matcher/methods'
|
|
|
|
require 'mutant/matcher/namespace'
|
2013-04-20 15:16:48 -04:00
|
|
|
require 'mutant/matcher/scope'
|
2013-09-08 15:58:39 -04:00
|
|
|
require 'mutant/matcher/filter'
|
2014-02-13 10:47:29 -05:00
|
|
|
require 'mutant/matcher/null'
|
2012-08-14 16:45:34 -04:00
|
|
|
require 'mutant/killer'
|
2014-04-28 15:17:25 -04:00
|
|
|
require 'mutant/test'
|
2012-11-21 18:10:50 -05:00
|
|
|
require 'mutant/strategy'
|
2012-08-14 16:45:34 -04:00
|
|
|
require 'mutant/runner'
|
2013-02-02 10:32:13 -05:00
|
|
|
require 'mutant/runner/config'
|
2013-02-01 17:06:07 -05:00
|
|
|
require 'mutant/runner/subject'
|
|
|
|
require 'mutant/runner/mutation'
|
2014-04-28 15:17:25 -04:00
|
|
|
require 'mutant/runner/killer'
|
2012-08-28 13:15:10 -04:00
|
|
|
require 'mutant/cli'
|
2013-01-21 14:08:30 -05:00
|
|
|
require 'mutant/cli/classifier'
|
|
|
|
require 'mutant/cli/classifier/namespace'
|
|
|
|
require 'mutant/cli/classifier/method'
|
2012-08-16 12:02:03 -04:00
|
|
|
require 'mutant/color'
|
2014-05-11 11:04:11 -04:00
|
|
|
require 'mutant/diff'
|
2012-08-15 22:10:54 -04:00
|
|
|
require 'mutant/reporter'
|
|
|
|
require 'mutant/reporter/null'
|
|
|
|
require 'mutant/reporter/cli'
|
2013-06-21 11:52:53 -04:00
|
|
|
require 'mutant/reporter/cli/printer'
|
2013-06-21 17:52:57 -04:00
|
|
|
require 'mutant/reporter/cli/printer/config'
|
|
|
|
require 'mutant/reporter/cli/printer/subject'
|
|
|
|
require 'mutant/reporter/cli/printer/mutation'
|
2014-05-09 19:59:30 -04:00
|
|
|
require 'mutant/reporter/cli/printer/progress'
|
2013-06-28 17:23:05 -04:00
|
|
|
require 'mutant/zombifier'
|
2014-04-04 10:14:24 -04:00
|
|
|
require 'mutant/zombifier/file'
|