diff --git a/lib/mutant/mutator/node/case.rb b/lib/mutant/mutator/node/case.rb index c3ede50d..04907b7a 100644 --- a/lib/mutant/mutator/node/case.rb +++ b/lib/mutant/mutator/node/case.rb @@ -47,6 +47,7 @@ module Mutant mutate_child(index) dup_children = children.dup dup_children.delete_at(index) + return if dup_children.none? { |child| child.type == :when } if dup_children.last.type == :when dup_children << nil end diff --git a/spec/unit/mutant/mutator/node/case/mutation_spec.rb b/spec/unit/mutant/mutator/node/case/mutation_spec.rb index 34acc5a0..28eb269b 100644 --- a/spec/unit/mutant/mutator/node/case/mutation_spec.rb +++ b/spec/unit/mutant/mutator/node/case/mutation_spec.rb @@ -3,224 +3,317 @@ require 'spec_helper' describe Mutant::Mutator::Node::Case do let(:random_string) { 'random' } - let(:source) { ':foo' } - - let(:mutations) do - %w(nil) << ":s#{random_string}" - end - before do Mutant::Random.stub(:hex_string => random_string) end - let(:source) do - <<-RUBY - case :condition - when :foo - :foo - when :bar, :baz - :barbaz - else - :else - end - RUBY + context 'with multiple when branches' do + let(:source) do + <<-RUBY + case :condition + when :foo + :foo + when :bar, :baz + :barbaz + else + :else + end + RUBY + end + + let(:mutations) do + mutations = [] + + # Presence of branches + mutations << <<-RUBY + case :condition + when :bar, :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :bar, :baz + :barbaz + end + RUBY + + # Mutations of condition + mutations << <<-RUBY + case nil + when :foo + :foo + when :bar, :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :srandom + when :foo + :foo + when :bar, :baz + :barbaz + else + :else + end + RUBY + + # Mutations of branch bodies + mutations << <<-RUBY + case :condition + when :foo + nil + when :bar, :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :srandom + when :bar, :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :bar, :baz + :srandom + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :bar, :baz + nil + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :bar, :baz + :barbaz + else + :srandom + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :bar, :baz + :barbaz + else + nil + end + RUBY + + # Mutations of when conditions + mutations << <<-RUBY + case :condition + when :srandom + :foo + when :bar, :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when nil + :foo + when :bar, :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :srandom, :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when nil, :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :bar, nil + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :bar, :srandom + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :baz + :barbaz + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + when :bar + :barbaz + else + :else + end + RUBY + end + + it_should_behave_like 'a mutator' end - let(:mutations) do - mutations = [] + context 'with one when branch' do + let(:source) do + <<-RUBY + case :condition + when :foo + :foo + else + :else + end + RUBY + end - # Presence of branches - mutations << <<-RUBY - case :condition - when :bar, :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :bar, :baz - :barbaz - end - RUBY + let(:mutations) do + mutations = [] - # Mutations of condition - mutations << <<-RUBY - case nil - when :foo - :foo - when :bar, :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :srandom - when :foo - :foo - when :bar, :baz - :barbaz - else - :else - end - RUBY + # Presence of branches + mutations << <<-RUBY + case :condition + when :foo + :foo + end + RUBY - # Mutations of branch bodies - mutations << <<-RUBY - case :condition - when :foo - nil - when :bar, :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :srandom - when :bar, :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :bar, :baz - :srandom - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :bar, :baz - nil - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :bar, :baz - :barbaz - else - :srandom - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :bar, :baz - :barbaz - else - nil - end - RUBY + # Mutations of condition + mutations << <<-RUBY + case nil + when :foo + :foo + else + :else + end + RUBY + mutations << <<-RUBY + case :srandom + when :foo + :foo + else + :else + end + RUBY - # Mutations of when conditions - mutations << <<-RUBY - case :condition - when :srandom - :foo - when :bar, :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when nil - :foo - when :bar, :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :srandom, :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when nil, :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :bar, nil - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :bar, :srandom - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :baz - :barbaz - else - :else - end - RUBY - mutations << <<-RUBY - case :condition - when :foo - :foo - when :bar - :barbaz - else - :else - end - RUBY + # Mutations of branch bodies + mutations << <<-RUBY + case :condition + when :foo + nil + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :srandom + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + else + :srandom + end + RUBY + mutations << <<-RUBY + case :condition + when :foo + :foo + else + nil + end + RUBY + + # Mutations of when conditions + mutations << <<-RUBY + case :condition + when :srandom + :foo + else + :else + end + RUBY + mutations << <<-RUBY + case :condition + when nil + :foo + else + :else + end + RUBY + end + + it_should_behave_like 'a mutator' end - - it_should_behave_like 'a mutator' end