Add global, local and instance variable assignment mutators

This commit is contained in:
Markus Schirp 2013-01-01 19:50:36 +01:00
parent 9e51c44c1f
commit cbdc84db88
5 changed files with 114 additions and 28 deletions

View file

@ -83,6 +83,7 @@ require 'mutant/mutator/node/literal/nil'
require 'mutant/mutator/node/block'
require 'mutant/mutator/node/noop'
require 'mutant/mutator/node/send'
require 'mutant/mutator/node/assignment'
require 'mutant/mutator/node/define'
require 'mutant/mutator/node/formal_arguments_19'
require 'mutant/mutator/node/formal_arguments_19/default_mutations'
@ -93,7 +94,6 @@ require 'mutant/mutator/node/pattern_arguments'
require 'mutant/mutator/node/pattern_variable'
require 'mutant/mutator/node/default_arguments'
require 'mutant/mutator/node/return'
require 'mutant/mutator/node/local_variable_assignment'
require 'mutant/mutator/node/iter_19'
require 'mutant/mutator/node/if_statement'
require 'mutant/mutator/node/receiver_case'

View file

@ -0,0 +1,48 @@
module Mutant
class Mutator
class Node
class Assignment < self
private
class Variable < self
# Emit mutants
#
# @return [undefined]
#
# @api private
#
def dispatch
emit_attribute_mutations(:name) do |mutation|
mutation.name = "#{self.class::PREFIX}#{mutation.name}".to_sym
end
emit_attribute_mutations(:value)
end
class Local < self
PREFIX = ''.freeze
handle(Rubinius::AST::LocalVariableAssignment)
end
class Instance < self
PREFIX = '@'.freeze
handle(Rubinius::AST::InstanceVariableAssignment)
end
class Class < self
PREFIX = '@@'.freeze
handle(Rubinius::AST::ClassVariableAssignment)
end
class Global < self
PREFIX = '$'.freeze
handle(Rubinius::AST::GlobalVariableAssignment)
end
end
end
end
end
end

View file

@ -1,25 +0,0 @@
module Mutant
class Mutator
class Node
class LocalVariableAssignment < self
handle(Rubinius::AST::LocalVariableAssignment)
private
# Emit mutants
#
# @return [undefined]
#
# @api private
#
def dispatch
emit_attribute_mutations(:name)
emit_attribute_mutations(:value)
end
end
end
end
end

View file

@ -22,12 +22,11 @@ module Mutant
handle(Rubinius::AST::ZSuper)
handle(Rubinius::AST::MultipleAssignment)
handle(Rubinius::AST::ScopedConstant)
handle(Rubinius::AST::LocalVariableAssignment)
handle(Rubinius::AST::LocalVariableAccess)
handle(Rubinius::AST::InstanceVariableAssignment)
handle(Rubinius::AST::InstanceVariableAccess)
handle(Rubinius::AST::GlobalVariableAssignment)
handle(Rubinius::AST::GlobalVariableAccess)
handle(Rubinius::AST::ClassVariableAccess)
handle(Rubinius::AST::ToplevelConstant)
handle(Rubinius::AST::Ensure)
handle(Rubinius::AST::Rescue)

View file

@ -0,0 +1,64 @@
require 'spec_helper'
describe Mutant::Mutator::Node::Assignment, 'mutations' do
before do
Mutant::Random.stub(:hex_string => :random)
end
context 'global variable' do
let(:source) { '$a = true' }
let(:mutations) do
mutations = []
mutations << '$srandom = true'
mutations << '$a = false'
mutations << '$a = nil'
end
it_should_behave_like 'a mutator'
end
context 'class variable' do
let(:source) { '@@a = true' }
let(:mutations) do
mutations = []
mutations << '@@srandom = true'
mutations << '@@a = false'
mutations << '@@a = nil'
end
it_should_behave_like 'a mutator'
end
context 'instance variable' do
let(:source) { '@a = true' }
let(:mutations) do
mutations = []
mutations << '@srandom = true'
mutations << '@a = false'
mutations << '@a = nil'
end
it_should_behave_like 'a mutator'
end
context 'local variable' do
let(:source) { 'a = true' }
let(:mutations) do
mutations = []
mutations << 'srandom = true'
mutations << 'a = false'
mutations << 'a = nil'
end
it_should_behave_like 'a mutator'
end
end