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
-
.constant_lookup(location) ⇒ Object
private
Lookup constant for location.
-
.isolate(&block) ⇒ Object
private
Call block in isolation.
-
.singleton_subclass_instance(name, superclass, &block) ⇒ self
private
Define instance of subclassed superclass as constant.
-
.zombify ⇒ self
private
Perform self zombification.
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
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.
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
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 |