From 64862e8b8627469dc821ef5490c6a8a2796b39ba Mon Sep 17 00:00:00 2001 From: Markus Schirp Date: Mon, 24 Dec 2018 00:09:36 +0000 Subject: [PATCH] Fix emit of invalid block body promotions --- lib/mutant/mutator/node/block.rb | 11 +++++- meta/block.rb | 58 ++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/lib/mutant/mutator/node/block.rb b/lib/mutant/mutator/node/block.rb index 84069877..ae31e6aa 100644 --- a/lib/mutant/mutator/node/block.rb +++ b/lib/mutant/mutator/node/block.rb @@ -32,12 +32,21 @@ module Mutant emit_body(N_RAISE) return unless body - emit(body) + emit(body) unless body_has_control? emit_body_mutations mutate_body_receiver end + # Test if body has control structures + # + # @return [Boolean] + def body_has_control? + AST.find_last_path(body) do |node| + n_break?(node) || n_next?(node) + end.any? + end + # Mutate method send in body scope of `send` # # @return [undefined] diff --git a/meta/block.rb b/meta/block.rb index 74bdb303..111af626 100644 --- a/meta/block.rb +++ b/meta/block.rb @@ -121,3 +121,61 @@ Mutant::Meta::Example.add :block do mutation 'foo { }' mutation 'foo' end + +Mutant::Meta::Example.add :block do + source 'foo { next if true }' + + singleton_mutations + mutation 'foo' + mutation 'foo { }' + mutation 'foo { self }' + mutation 'foo { nil }' + mutation 'foo { raise }' + mutation 'foo { self if true }' + mutation 'foo { nil if true }' + mutation 'foo { break if true }' + mutation 'foo { next if !true }' + mutation 'foo { next if false }' + mutation 'foo { next if nil }' + mutation 'foo { next }' +end + +Mutant::Meta::Example.add :block do + source 'foo { next }' + + singleton_mutations + mutation 'foo { nil }' + mutation 'foo { raise }' + mutation 'foo { self }' + mutation 'foo { break }' + mutation 'foo { }' + mutation 'foo' +end + +Mutant::Meta::Example.add :block do + source 'foo { break if true }' + + singleton_mutations + mutation 'foo' + mutation 'foo { }' + mutation 'foo { self }' + mutation 'foo { nil }' + mutation 'foo { raise }' + mutation 'foo { self if true }' + mutation 'foo { nil if true }' + mutation 'foo { break if !true }' + mutation 'foo { break if false }' + mutation 'foo { break if nil }' + mutation 'foo { break }' +end + +Mutant::Meta::Example.add :block do + source 'foo { break }' + + singleton_mutations + mutation 'foo { nil }' + mutation 'foo { raise }' + mutation 'foo { self }' + mutation 'foo { }' + mutation 'foo' +end