Module: Mutant

Defined in:
lib/mutant.rb,
lib/mutant/cli.rb,
lib/mutant/diff.rb,
lib/mutant/meta.rb,
lib/mutant/test.rb,
lib/mutant/cache.rb,
lib/mutant/color.rb,
lib/mutant/config.rb,
lib/mutant/killer.rb,
lib/mutant/loader.rb,
lib/mutant/runner.rb,
lib/mutant/walker.rb,
lib/mutant/context.rb,
lib/mutant/matcher.rb,
lib/mutant/mutator.rb,
lib/mutant/subject.rb,
lib/mutant/version.rb,
lib/mutant/mutation.rb,
lib/mutant/reporter.rb,
lib/mutant/strategy.rb,
lib/mutant/constants.rb,
lib/mutant/delegator.rb,
lib/mutant/zombifier.rb,
lib/mutant/expression.rb,
lib/mutant/matcher/null.rb,
lib/mutant/meta/example.rb,
lib/mutant/mutator/node.rb,
lib/mutant/mutator/util.rb,
lib/mutant/node_helpers.rb,
lib/mutant/reporter/cli.rb,
lib/mutant/context/scope.rb,
lib/mutant/matcher/chain.rb,
lib/mutant/matcher/scope.rb,
lib/mutant/mutation/evil.rb,
lib/mutant/reporter/null.rb,
lib/mutant/runner/config.rb,
lib/mutant/runner/killer.rb,
lib/mutant/matcher/filter.rb,
lib/mutant/matcher/method.rb,
lib/mutant/reporter/trace.rb,
lib/mutant/runner/subject.rb,
lib/mutant/subject/method.rb,
lib/mutant/warning_filter.rb,
lib/mutant/zombifier/file.rb,
lib/mutant/matcher/methods.rb,
lib/mutant/mutator/node/if.rb,
lib/mutant/runner/mutation.rb,
lib/mutant/meta/example/dsl.rb,
lib/mutant/mutation/neutral.rb,
lib/mutant/mutator/registry.rb,
lib/mutant/require_highjack.rb,
lib/mutant/expression/method.rb,
lib/mutant/matcher/namespace.rb,
lib/mutant/mutator/node/case.rb,
lib/mutant/mutator/node/dstr.rb,
lib/mutant/mutator/node/dsym.rb,
lib/mutant/mutator/node/mlhs.rb,
lib/mutant/mutator/node/next.rb,
lib/mutant/mutator/node/noop.rb,
lib/mutant/mutator/node/send.rb,
lib/mutant/mutator/node/when.rb,
lib/mutant/mutator/node/begin.rb,
lib/mutant/mutator/node/block.rb,
lib/mutant/mutator/node/break.rb,
lib/mutant/mutator/node/const.rb,
lib/mutant/mutator/node/masgn.rb,
lib/mutant/mutator/node/splat.rb,
lib/mutant/mutator/node/super.rb,
lib/mutant/mutator/node/yield.rb,
lib/mutant/mutator/util/array.rb,
lib/mutant/mutator/node/binary.rb,
lib/mutant/mutator/node/define.rb,
lib/mutant/mutator/node/nthref.rb,
lib/mutant/mutator/node/rescue.rb,
lib/mutant/mutator/node/return.rb,
lib/mutant/mutator/node/zsuper.rb,
lib/mutant/mutator/util/symbol.rb,
lib/mutant/reporter/cli/report.rb,
lib/mutant/warning_expectation.rb,
lib/mutant/expression/namespace.rb,
lib/mutant/mutator/node/defined.rb,
lib/mutant/mutator/node/generic.rb,
lib/mutant/mutator/node/kwbegin.rb,
lib/mutant/mutator/node/literal.rb,
lib/mutant/mutator/node/op_asgn.rb,
lib/mutant/mutator/node/or_asgn.rb,
lib/mutant/mutator/node/resbody.rb,
lib/mutant/mutator/node/restarg.rb,
lib/mutant/reporter/cli/printer.rb,
lib/mutant/matcher/method/finder.rb,
lib/mutant/mutator/node/and_asgn.rb,
lib/mutant/mutator/node/argument.rb,
lib/mutant/mutator/node/blockarg.rb,
lib/mutant/reporter/cli/progress.rb,
lib/mutant/reporter/cli/registry.rb,
lib/mutant/mutator/node/arguments.rb,
lib/mutant/matcher/method/instance.rb,
lib/mutant/mutator/node/send/index.rb,
lib/mutant/subject/method/instance.rb,
lib/mutant/matcher/method/singleton.rb,
lib/mutant/mutator/node/literal/nil.rb,
lib/mutant/mutator/node/send/binary.rb,
lib/mutant/subject/method/singleton.rb,
lib/mutant/mutator/node/literal/hash.rb,
lib/mutant/mutator/node/literal/array.rb,
lib/mutant/mutator/node/literal/float.rb,
lib/mutant/mutator/node/literal/range.rb,
lib/mutant/mutator/node/literal/regex.rb,
lib/mutant/reporter/cli/progress/noop.rb,
lib/mutant/reporter/cli/report/config.rb,
lib/mutant/mutator/node/literal/fixnum.rb,
lib/mutant/mutator/node/literal/string.rb,
lib/mutant/mutator/node/literal/symbol.rb,
lib/mutant/reporter/cli/report/subject.rb,
lib/mutant/mutator/node/literal/boolean.rb,
lib/mutant/reporter/cli/progress/config.rb,
lib/mutant/reporter/cli/report/mutation.rb,
lib/mutant/mutator/node/conditional_loop.rb,
lib/mutant/reporter/cli/progress/subject.rb,
lib/mutant/reporter/cli/progress/mutation.rb,
lib/mutant/mutator/node/match_current_line.rb,
lib/mutant/mutator/node/named_value/access.rb,
lib/mutant/mutator/node/send/attribute_assignment.rb,
lib/mutant/mutator/node/named_value/constant_assignment.rb,
lib/mutant/mutator/node/named_value/variable_assignment.rb

Overview

Library namespace

Defined Under Namespace

Modules: Delegator, Meta, NodeHelpers Classes: CLI, Cache, Color, Config, Context, Diff, Expression, Killer, Loader, Matcher, Mutation, Mutator, Reporter, RequireHighjack, Runner, Strategy, Subject, Test, Walker, WarningExpectation, WarningFilter, Zombifier

Constant Summary collapse

EMPTY_STRING =

The frozen empty string used within mutant

''.freeze
EMPTY_ARRAY =

The frozen empty array used within mutant

[].freeze
IsolationError =
Class.new(RuntimeError)
VERSION =

The current mutant version

'0.5.19'.freeze
SCOPE_OPERATOR =
'::'.freeze
CBASE_PATTERN =
/\A#{SCOPE_OPERATOR}/.freeze
NOT_ASSIGNABLE =

Set of nodes that cannot be on the LHS of an assignment

symbolset.(%w[int float str dstr class module self])
OP_ASSIGN =

Set of op-assign types

symbolset.call(%w[or_asgn and_asgn op_asgn])
NOT_STANDALONE =

Set of node types that are not valid when emitted standalone

symbolset.(%w[ splat restarg block_pass])
INDEX_OPERATORS =
symbolset.(%w[[] []=])
UNARY_METHOD_OPERATORS =
symbolset.(%w[~@ +@ -@ !])
METHOD_OPERATORS =

Operators ruby implementeds as methods

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
NODE_BLACKLIST =

Nodes that are NOT handled by mutant.

not - 1.8 only, mutant does not support 1.8

symbolset.(%w[not])
NODE_EXTRA =

Nodes that are NOT generated by parser but used by mutant / unparser.

symbolset.(%w[empty])
NODE_TYPES =
((Parser::Meta::NODE_TYPES + NODE_EXTRA) - NODE_BLACKLIST).to_set.freeze

Class Method Summary collapse

Class Method Details

.constant_lookup(location) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Lookup constant for location

Parameters:

  • location (String)

Returns:

  • (Object)


37
38
39
40
41
# File 'lib/mutant.rb', line 37

def self.constant_lookup(location)
  location.sub(CBASE_PATTERN, EMPTY_STRING).split(SCOPE_OPERATOR).reduce(Object) do |parent, name|
    parent.const_get(name, nil)
  end
end

.isolate(&block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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.

Returns:

  • (Object)


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/mutant.rb', line 66

def self.isolate(&block)
  reader, writer = IO.pipe.each(&:binmode)

  pid = fork do
    reader.close
    writer.write(Marshal.dump(block.call))
  end

  writer.close

  begin
    data = Marshal.load(reader.read)
  rescue ArgumentError
    raise IsolationError, 'Childprocess wrote un-unmarshallable data'
  end

  status = Process.waitpid2(pid).last

  unless status.exitstatus.zero?
    raise IsolationError, "Childprocess exited with nonzero exit status: #{status.exitstatus}"
  end

  data
end

.singleton_subclass_instance(name, superclass, &block) ⇒ self

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Define instance of subclassed superclass as constant

Parameters:

  • superclass (Class)
  • name (Symbol)

Returns:

  • (self)


100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/mutant.rb', line 100

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

.zombifyself

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Perform self zombification

Returns:

  • (self)


49
50
51
52
# File 'lib/mutant.rb', line 49

def self.zombify
  Zombifier.run('mutant', :Zombie)
  self
end