free_mutant/lib/mutant/mutatee.rb
Markus Schirp 9e8b451933 Add mutation for some literals
* This is in progress code. The plan is to support all literals before
  beginning to cleanup and dedup the mutation generation. Have to
  understand the AST and the possible mutations more in depth before
  making structural decisions here.
2012-07-27 22:39:31 +02:00

85 lines
1.4 KiB
Ruby

module Mutant
# Represent a mutatable AST and its context
class Mutatee
include Veritas::Immutable, Enumerable
# Return context
#
# @return [Context]
#
# @api private
#
attr_reader :context
# Return AST node
#
# @return [Rubinius::AST::Node]
#
# @api private
#
attr_reader :node
# Enumerate possible mutations
#
# @return [self]
# returns self if block given
#
# @return [Enumerator]
# returns eumerator if no block given
#
# @api private
#
def each(&block)
return to_enum(__method__) unless block_given?
Mutator.build(node).each(&block)
self
end
# Reset implementation to original
#
# This method inserts the original node again.
#
# @return [self]
#
# @api private
#
def reset
insert(@node)
self
end
private
# Initialize a mutatee
#
# @param [Context] context
# the context of mutations
#
# @param [Rubinius::AST::Node] node
# the node to be mutated
#
# @return [unkown]
#
# @api private
#
def initialize(context,node)
@context,@node = context,node
end
# Insert AST node under context
#
# @param [Rubinius::AST::Node] node
#
# @return [self]
#
# @api private
#
def insert(node)
Loader.load(context.root(node))
self
end
end
end