Skip to content

Commit

Permalink
Add #reduce -> #sum mutations
Browse files Browse the repository at this point in the history
Adds:
  * `a.reduce(:+)`     -> `a.sum`
  * `a.reduce(0, &:+)` -> `a.sum(0)`
  * ...
  • Loading branch information
dgollahon committed Jan 10, 2021
1 parent 4ac7151 commit 630d9e8
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Unreleased

* [#1202](https://github.com/mbj/mutant/pull/1202)

* Add `#reduce` -> `#sum` mutations
* `a.reduce(:+)` -> `a.sum`
* `a.reduce(0, &:+)` -> `a.sum(0)`

* [#1201](https://github.com/mbj/mutant/pull/1201)

* Add `/\Astatic/` -> `#start_with?` mutations:
Expand Down
16 changes: 16 additions & 0 deletions lib/mutant/mutator/node/send.rb
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ def normal_dispatch
end

def emit_selector_specific_mutations
emit_reduce_to_sum_mutation
emit_start_end_with_mutations
emit_predicate_mutations
emit_array_mutation
Expand All @@ -99,6 +100,21 @@ def emit_selector_specific_mutations
emit_lambda_mutation
end

def emit_reduce_to_sum_mutation
return unless selector.equal?(:reduce)

reducer = arguments.last

return unless reducer.eql?(s(:sym, :+)) || reducer.eql?(s(:block_pass, s(:sym, :+)))

if arguments.length > 1
initial_value = arguments.first
emit_type(receiver, :sum, initial_value)
else
emit_type(receiver, :sum)
end
end

def emit_start_end_with_mutations # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
return unless REGEXP_MATCH_METHODS.include?(selector) && arguments.one?

Expand Down
58 changes: 58 additions & 0 deletions meta/send.rb
Original file line number Diff line number Diff line change
Expand Up @@ -826,3 +826,61 @@
mutation 'self.match(/foo\z/)'
mutation "a.end_with?('foo')"
end


Mutant::Meta::Example.add :send do
source 'a.reduce(:+)'

singleton_mutations

mutation 'a'
mutation 'self.reduce(:+)'
mutation 'a.reduce'
mutation 'a.reduce(nil)'
mutation 'a.reduce(self)'
mutation 'a.reduce(:"+__mutant__")'
mutation ':+'
mutation 'a.sum'
end

Mutant::Meta::Example.add :send do
source 'a.reduce(INITIAL, &:+)'

singleton_mutations

mutation 'a'
mutation 'a.reduce'
mutation 'a.reduce(nil, &:+)'
mutation 'a.reduce(self, &:+)'
mutation 'a.reduce(INITIAL, &nil)'
mutation 'a.reduce(INITIAL, &self)'
mutation 'a.reduce(INITIAL)'
mutation 'a.reduce(&:+)'
mutation 'self.reduce(INITIAL, &:+)'
mutation 'a.reduce(INITIAL, &:"+__mutant__")'
mutation 'a.sum(INITIAL)'
end

Mutant::Meta::Example.add :send do
source 'reduce(:*)'

singleton_mutations

mutation 'reduce'
mutation ':*'
mutation 'reduce(nil)'
mutation 'reduce(self)'
mutation 'reduce(:"*__mutant__")'
end

Mutant::Meta::Example.add :send do
source 'foo(:+)'

singleton_mutations

mutation 'foo'
mutation ':+'
mutation 'foo(nil)'
mutation 'foo(self)'
mutation 'foo(:"+__mutant__")'
end

0 comments on commit 630d9e8

Please sign in to comment.