class Mutest::Mutator

Generator for mutations

Generator for mutations

Constants

REGISTRY

Attributes

output[R]

Return output

@return [Set<Parser::AST::Node>]

Public Class Methods

mutate(node, filter = ->(_) {} click to toggle source

Lookup and invoke dedicated AST mutator

@param node [Parser::AST::Node] @param parent [nil,Mutest::Mutator::Node]

@return [Set<Parser::AST::Node>]

# File lib/mutest/mutator.rb, line 17
def self.mutate(node, filter = ->(_) {}, parent = nil)
  self::REGISTRY.lookup(node.type).call(node, filter, parent)
end
new(_input, _filter, _parent = nil) click to toggle source

Initialize object

@param [Object] input @param [#call] mutation filter @param [Object] parent @param [#call(node)] block

@return [undefined]

Calls superclass method
# File lib/mutest/mutator.rb, line 46
def initialize(_input, _filter, _parent = nil)
  super

  @output = Set.new

  dispatch unless disabled?
end

Private Class Methods

handle(*types) click to toggle source

Register node class handler

@return [undefined]

# File lib/mutest/mutator.rb, line 24
def self.handle(*types)
  types.each do |type|
    self::REGISTRY.register(type, self)
  end
end

Private Instance Methods

disabled?() click to toggle source
# File lib/mutest/mutator.rb, line 54
def disabled?
  filter.call(input)
end
dup_input() click to toggle source

Shortcut to create a new unfrozen duplicate of input

@return [Object]

# File lib/mutest/mutator.rb, line 86
def dup_input
  input.dup
end
emit(object) click to toggle source

Emit generated mutation if object is not equivalent to input

@param [Object] object

@return [undefined]

# File lib/mutest/mutator.rb, line 77
def emit(object)
  return unless new?(object)

  output << object
end
mutate(node, parent = nil) click to toggle source

Mutate child nodes within source path

@return [Set<Parser::AST::Node>]

# File lib/mutest/mutator.rb, line 93
def mutate(node, parent = nil)
  self.class.mutate(node, filter, parent)
end
mutate_with(mutator, nodes, &block) click to toggle source

Mutate nodes using a specific mutator class

@yield [Object] value emitted by provided mutator

@return [undefined]

# File lib/mutest/mutator.rb, line 109
def mutate_with(mutator, nodes, &block)
  block ||= method(:emit)

  mutator.call(nodes, filter).each(&block)
end
new?(object) click to toggle source

Test if generated object is not guarded from emitting

@param [Object] object

@return [Boolean]

# File lib/mutest/mutator.rb, line 63
def new?(object)
  !object.eql?(input)
end
run(mutator) click to toggle source

Run input with mutator

@return [undefined]

# File lib/mutest/mutator.rb, line 100
def run(mutator)
  mutate_with(mutator, input)
end