Add a shitload of operator expansions

This commit is contained in:
Markus Schirp 2012-12-08 00:52:03 +01:00
parent b5430e2000
commit bc408d52d2
3 changed files with 217 additions and 13 deletions

View file

@ -1,4 +1,10 @@
# v0.2.1 xxx
# v0.2.1 2012-12-07
* [feature] Add a shitload of operator expansions for dm2 strategy
[Compare v0.2.1..v0.2.2](https://github.com/mbj/mutant/compare/v0.2.1...v0.2.2)
# v0.2.1 2012-12-07
* [fixed] Crash on unavailable source location
* [fixed] Incorrect handling of if and unless statements

View file

@ -56,6 +56,38 @@ module Mutant
mutation.subject.matcher
end
MAPPING = {
:'!~' => :nomatch_operator,
:'!=' => :inequality_operator,
:<=> => :spaceship_operator,
:=== => :case_equality_operator,
:[]= => :element_writer,
:[] => :element_reader,
:== => :equality_operator,
:<= => :less_than_or_equal_to_operator,
:>= => :greater_than_or_equal_to_operator,
:=~ => :match_operator,
:<< => :left_shift_operator,
:>> => :right_shift_operator,
:** => :exponentation_operator,
:* => :multiplication_operator,
:% => :modulo_operator,
:/ => :division_operator,
:| => :bitwise_or_operator,
:^ => :bitwise_xor_operator,
:& => :bitwise_and_operator,
:< => :less_than_operator,
:> => :greater_than_operator,
:+ => :addition_operator,
:- => :substraction_operator
}
EXPANSIONS = {
/\?\z/ => '_predicate',
/=\z/ => '_writer',
/!\z/ => '_bang'
}
# Return spec file
#
# @return [String]
@ -63,15 +95,34 @@ module Mutant
# @api private
#
def spec_file
method_name.to_s.
gsub(/\A\[\]\z/, 'element_reader').
gsub(/\A\[\]=\z/, 'element_writer').
gsub(/\?\z/, '_predicate').
gsub(/=\z/, '_writer').
gsub(/!\z/, '_bang') + '_spec.rb'
"#{mapped_name || expanded_name}_spec.rb"
end
memoize :spec_file
# Return mapped name
#
# @return [Symbol]
# if name was mapped
#
# @return [nil]
# otherwise
#
def mapped_name
MAPPING[method_name]
end
# Return expanded name
#
# @return [Symbol]
#
# @api private
#
def expanded_name
EXPANSIONS.inject(method_name) do |name, (regexp, expansion)|
name.to_s.gsub(regexp, expansion)
end.to_sym
end
# Return method name
#
# @return [Symbol]

View file

@ -16,15 +16,162 @@ describe Mutant::Strategy::Rspec::ExampleLookup, '#spec_file' do
it { should be_frozen }
end
context 'with bitwise xor method' do
let(:method_name) { :^ }
let(:expected_spec_file) { 'bitwise_xor_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with bitwise or method' do
let(:method_name) { :| }
let(:expected_spec_file) { 'bitwise_or_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with bitwise and method' do
let(:method_name) { :& }
let(:expected_spec_file) { 'bitwise_and_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with spaceship method' do
let(:method_name) { :<=> }
let(:expected_spec_file) { 'spaceship_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with case equality operator method' do
let(:method_name) { :=== }
let(:expected_spec_file) { 'case_equality_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with modulo operator method' do
let(:method_name) { :% }
let(:expected_spec_file) { 'modulo_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with exponentation operator method' do
let(:method_name) { :** }
let(:expected_spec_file) { 'exponentation_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with substraction operator method' do
let(:method_name) { :- }
let(:expected_spec_file) { 'substraction_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with addition operator method' do
let(:method_name) { :+ }
let(:expected_spec_file) { 'addition_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with greater than or equal to operator method' do
let(:method_name) { :>= }
let(:expected_spec_file) { 'greater_than_or_equal_to_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with less than or equal to operator method' do
let(:method_name) { :<= }
let(:expected_spec_file) { 'less_than_or_equal_to_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with greater than operator method' do
let(:method_name) { :> }
let(:expected_spec_file) { 'greater_than_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with less than operator method' do
let(:method_name) { :< }
let(:expected_spec_file) { 'less_than_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with right shift operator method' do
let(:method_name) { :>> }
let(:expected_spec_file) { 'right_shift_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with left shift operator method' do
let(:method_name) { :<< }
let(:expected_spec_file) { 'left_shift_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with division operator method' do
let(:method_name) { :/ }
let(:expected_spec_file) { 'division_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with multiplication operator method' do
let(:method_name) { :* }
let(:expected_spec_file) { 'multiplication_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with nomatch operator method' do
let(:method_name) { :'!~' }
let(:expected_spec_file) { 'nomatch_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with match operator method' do
let(:method_name) { :=~ }
let(:expected_spec_file) { 'match_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with inequality operator method' do
let(:method_name) { :'!=' }
let(:expected_spec_file) { 'inequality_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with equality operator method' do
let(:method_name) { :== }
let(:expected_spec_file) { 'equality_operator_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with element reader method' do
let(:method_name) { '[]' }
let(:method_name) { :[] }
let(:expected_spec_file) { 'element_reader_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with element writer method' do
let(:method_name) { '[]=' }
let(:method_name) { :[]= }
let(:expected_spec_file) { 'element_writer_spec.rb' }
@ -32,28 +179,28 @@ describe Mutant::Strategy::Rspec::ExampleLookup, '#spec_file' do
end
context 'with writer method' do
let(:method_name) { 'foo=' }
let(:method_name) { :foo= }
let(:expected_spec_file) { 'foo_writer_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with bang method' do
let(:method_name) { 'foo!' }
let(:method_name) { :foo! }
let(:expected_spec_file) { 'foo_bang_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with predicate method' do
let(:method_name) { 'foo?' }
let(:method_name) { :foo? }
let(:expected_spec_file) { 'foo_predicate_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'
end
context 'with regular method' do
let(:method_name) { 'foo' }
let(:method_name) { :foo }
let(:expected_spec_file) { 'foo_spec.rb' }
it_should_behave_like 'Mutant::Strategy::Rspec::ExampleLookup#spec_file'