2013-12-29 17:04:28 -05:00
|
|
|
# encoding: utf-8
|
|
|
|
|
|
|
|
module Mutant
|
|
|
|
class Mutator
|
|
|
|
class Node
|
|
|
|
# Mutation emitter to handle binary connectives
|
|
|
|
class Binary < self
|
|
|
|
|
|
|
|
INVERSE = {
|
|
|
|
and: :or,
|
|
|
|
or: :and
|
|
|
|
}.freeze
|
|
|
|
|
|
|
|
handle(*INVERSE.keys)
|
|
|
|
|
|
|
|
children :left, :right
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
# Emit mutations
|
|
|
|
#
|
|
|
|
# @return [undefined]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
#
|
|
|
|
def dispatch
|
2014-06-05 12:37:31 -04:00
|
|
|
emit_singletons
|
2013-12-29 17:04:28 -05:00
|
|
|
emit(left)
|
|
|
|
emit(right)
|
|
|
|
mutate_operator
|
|
|
|
mutate_operands
|
|
|
|
end
|
|
|
|
|
|
|
|
# Emit operator mutations
|
|
|
|
#
|
|
|
|
# @return [undefined]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
#
|
|
|
|
def mutate_operator
|
|
|
|
emit(s(INVERSE.fetch(node.type), left, right))
|
|
|
|
end
|
|
|
|
|
|
|
|
# Emit condition mutations
|
|
|
|
#
|
|
|
|
# @return [undefined]
|
|
|
|
#
|
|
|
|
# @api private
|
|
|
|
#
|
|
|
|
def mutate_operands
|
|
|
|
emit(s(node.type, n_not(left), right))
|
|
|
|
emit(n_not(node))
|
|
|
|
end
|
|
|
|
|
|
|
|
end # Binary
|
|
|
|
end # Node
|
|
|
|
end # Mutator
|
|
|
|
end # Mutant
|