Skip to content

Commit

Permalink
Merge pull request #44 from koic/fix_an_incorrect_auto_correct_for_so…
Browse files Browse the repository at this point in the history
…me_cops

[Fix #42] Fix an incorrect autocorrect for some cops of `Minitest`
  • Loading branch information
koic committed Dec 23, 2019
2 parents 1b1ee42 + 3ac1008 commit 17f8f60
Show file tree
Hide file tree
Showing 32 changed files with 487 additions and 83 deletions.
8 changes: 4 additions & 4 deletions .rubocop_todo.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2019-12-20 12:55:40 +0900 using RuboCop version 0.78.0.
# on 2019-12-21 01:15:41 +0900 using RuboCop version 0.78.0.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
Expand All @@ -10,14 +10,14 @@
Metrics/AbcSize:
Max: 17

# Offense count: 5
# Offense count: 19
# Configuration parameters: CountComments, ExcludedMethods.
Metrics/MethodLength:
Max: 14

# Offense count: 38
# Offense count: 40
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Layout/LineLength:
Max: 87
Max: 90
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## master (unreleased)

* [#42](https://github.com/rubocop-hq/rubocop-minitest/issues/42): Fix an incorrect autocorrect for some cops of `Minitest` department when using heredoc message. ([@koic][])

## 0.5.0 (2019-11-24)

### New features
Expand Down
10 changes: 5 additions & 5 deletions lib/rubocop/cop/minitest/assert_empty.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# assert_empty(object, 'the message')
#
class AssertEmpty < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `assert_empty(%<arguments>s)` over ' \
'`assert(%<receiver>s)`.'

Expand All @@ -37,11 +39,9 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
assert_with_empty(node) do |_first_receiver_arg, actual, rest_receiver_arg|
message = rest_receiver_arg.first

replacement = [actual.source, message&.source].compact.join(', ')
corrector.replace(node.loc.expression, "assert_empty(#{replacement})")
assert_with_empty(node) do |_, actual_arg|
corrector.replace(node.loc.selector, 'assert_empty')
corrector.replace(first_argument_range(node), actual_arg.source)
end
end
end
Expand Down
21 changes: 8 additions & 13 deletions lib/rubocop/cop/minitest/assert_equal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ module Minitest
# assert_equal("rubocop-minitest", actual)
#
class AssertEqual < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `assert_equal(%<preferred>s)` over ' \
'`assert(%<over>s)`.'

Expand All @@ -22,9 +24,7 @@ class AssertEqual < Cop
PATTERN

def on_send(node)
assert_equal(node) do
|first_receiver_arg, expected, actual, rest_receiver_arg|

assert_equal(node) do |first_receiver_arg, expected, actual, rest_receiver_arg|
message = rest_receiver_arg.first
preferred = [expected.source, actual.source, message&.source]
.compact.join(', ')
Expand All @@ -38,19 +38,14 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
assert_equal(node) do |_receiver, expected, actual, rest_receiver_arg|
message = rest_receiver_arg.first
replacement = node_arguments(expected, actual, message)
corrector.replace(node.loc.expression, "assert_equal(#{replacement})")
assert_equal(node) do |_, expected, actual|
corrector.replace(node.loc.selector, 'assert_equal')

replacement = [expected, actual].map(&:source).join(', ')
corrector.replace(first_argument_range(node), replacement)
end
end
end

private

def node_arguments(expected, actual, message)
[expected.source, actual.source, message&.source].compact.join(', ')
end
end
end
end
Expand Down
11 changes: 6 additions & 5 deletions lib/rubocop/cop/minitest/assert_includes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# assert_includes(collection, object, 'the message')
#
class AssertIncludes < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `assert_includes(%<arguments>s)` over ' \
'`assert(%<receiver>s)`.'

Expand All @@ -39,12 +41,11 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
assert_with_includes(node) do
|_receiver, collection, actual, rest_receiver_arg|
assert_with_includes(node) do |_, collection, actual|
corrector.replace(node.loc.selector, 'assert_includes')

message = rest_receiver_arg.first
replacement = node_arguments(collection, actual, message)
corrector.replace(node.loc.expression, "assert_includes(#{replacement})")
replacement = [collection, actual].map(&:source).join(', ')
corrector.replace(first_argument_range(node), replacement)
end
end
end
Expand Down
15 changes: 7 additions & 8 deletions lib/rubocop/cop/minitest/assert_instance_of.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# assert_instance_of(Class, object, 'the message')
#
class AssertInstanceOf < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `assert_instance_of(%<arguments>s)` over ' \
'`assert(%<receiver>s)`.'

Expand All @@ -24,9 +26,7 @@ class AssertInstanceOf < Cop
PATTERN

def on_send(node)
assert_with_instance_of(node) do
|first_receiver_arg, object, method, rest_args|

assert_with_instance_of(node) do |first_receiver_arg, object, method, rest_args|
message = rest_args.first
arguments = node_arguments(object, method, message)
receiver = [first_receiver_arg.source, message&.source].compact.join(', ')
Expand All @@ -39,12 +39,11 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
assert_with_instance_of(node) do |_, object, method, rest_args|
message = rest_args.first
arguments = node_arguments(object, method, message)
assert_with_instance_of(node) do |_, object, method|
corrector.replace(node.loc.selector, 'assert_instance_of')

replacement = "assert_instance_of(#{arguments})"
corrector.replace(node.loc.expression, replacement)
replacement = [method, object].map(&:source).join(', ')
corrector.replace(first_argument_range(node), replacement)
end
end
end
Expand Down
11 changes: 8 additions & 3 deletions lib/rubocop/cop/minitest/assert_nil.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# assert_nil(actual, 'the message')
#
class AssertNil < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `assert_nil(%<arguments>s)` over ' \
'`assert_equal(nil, %<arguments>s)`.'

Expand All @@ -35,9 +37,12 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
arguments = node.arguments.reject(&:nil_type?)
replacement = arguments.map(&:source).join(', ')
corrector.replace(node.loc.expression, "assert_nil(#{replacement})")
assert_equal_with_nil(node) do |actual|
corrector.replace(node.loc.selector, 'assert_nil')
corrector.replace(
first_and_second_arguments_range(node), actual.source
)
end
end
end
end
Expand Down
13 changes: 8 additions & 5 deletions lib/rubocop/cop/minitest/assert_respond_to.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ module Minitest
# assert_respond_to(self, some_method)
#
class AssertRespondTo < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `assert_respond_to(%<preferred>s)` over ' \
'`assert(%<over>s)`.'

Expand All @@ -37,11 +39,12 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
assert_with_respond_to(node) do |_, object, method, rest_args|
custom_message = rest_args.first
preferred = build_preferred_arguments(object, method, custom_message)
replacement = "assert_respond_to(#{preferred})"
corrector.replace(node.loc.expression, replacement)
assert_with_respond_to(node) do |_, object, method|
corrector.replace(node.loc.selector, 'assert_respond_to')

object = object ? object.source : 'self'
replacement = [object, method.source].join(', ')
corrector.replace(first_argument_range(node), replacement)
end
end
end
Expand Down
11 changes: 8 additions & 3 deletions lib/rubocop/cop/minitest/assert_truthy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# assert(actual, 'the message')
#
class AssertTruthy < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `assert(%<arguments>s)` over ' \
'`assert_equal(true, %<arguments>s)`.'

Expand All @@ -35,9 +37,12 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
arguments = node.arguments.reject(&:true_type?)
replacement = arguments.map(&:source).join(', ')
corrector.replace(node.loc.expression, "assert(#{replacement})")
assert_equal_with_truthy(node) do |actual|
corrector.replace(node.loc.selector, 'assert')
corrector.replace(
first_and_second_arguments_range(node), actual.source
)
end
end
end
end
Expand Down
10 changes: 5 additions & 5 deletions lib/rubocop/cop/minitest/refute_empty.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# refute_empty(object, 'the message')
#
class RefuteEmpty < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `refute_empty(%<arguments>s)` over ' \
'`refute(%<receiver>s)`.'

Expand All @@ -37,11 +39,9 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
refute_with_empty(node) do |_first_receiver_arg, object, rest_receiver_arg|
message = rest_receiver_arg.first

replacement = [object.source, message&.source].compact.join(', ')
corrector.replace(node.loc.expression, "refute_empty(#{replacement})")
refute_with_empty(node) do |_, actual_arg|
corrector.replace(node.loc.selector, 'refute_empty')
corrector.replace(first_argument_range(node), actual_arg.source)
end
end
end
Expand Down
15 changes: 7 additions & 8 deletions lib/rubocop/cop/minitest/refute_equal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ module Minitest
# refute_equal("rubocop-minitest", actual)
#
class RefuteEqual < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `refute_equal(%<preferred>s)` over ' \
'`assert(%<over>s)`.'

Expand All @@ -32,20 +34,17 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
assert_not_equal(node) do |_, first_arg, second_arg, rest_args|
autocorrect_node(node, corrector, first_arg, second_arg, rest_args)
assert_not_equal(node) do |_, expected, actual|
corrector.replace(node.loc.selector, 'refute_equal')

replacement = [expected, actual].map(&:source).join(', ')
corrector.replace(first_argument_range(node), replacement)
end
end
end

private

def autocorrect_node(node, corrector, first_arg, second_arg, rest_args)
custom_message = rest_args.first
replacement = preferred_usage(first_arg, second_arg, custom_message)
corrector.replace(node.loc.expression, "refute_equal(#{replacement})")
end

def preferred_usage(first_arg, second_arg, custom_message = nil)
[first_arg, second_arg, custom_message]
.compact.map(&:source).join(', ')
Expand Down
11 changes: 8 additions & 3 deletions lib/rubocop/cop/minitest/refute_false.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# refute(actual, 'the message')
#
class RefuteFalse < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `refute(%<arguments>s)` over ' \
'`assert_equal(false, %<arguments>s)`.'

Expand All @@ -35,9 +37,12 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
arguments = node.arguments.reject(&:false_type?)
replacement = arguments.map(&:source).join(', ')
corrector.replace(node.loc.expression, "refute(#{replacement})")
assert_equal_with_false(node) do |actual|
corrector.replace(node.loc.selector, 'refute')
corrector.replace(
first_and_second_arguments_range(node), actual.source
)
end
end
end
end
Expand Down
11 changes: 6 additions & 5 deletions lib/rubocop/cop/minitest/refute_includes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# refute_includes(collection, object, 'the message')
#
class RefuteIncludes < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `refute_includes(%<arguments>s)` over ' \
'`refute(%<receiver>s)`.'

Expand All @@ -39,12 +41,11 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
refute_with_includes(node) do
|_receiver, collection, object, rest_receiver_arg|
refute_with_includes(node) do |_, collection, actual|
corrector.replace(node.loc.selector, 'refute_includes')

message = rest_receiver_arg.first
replacement = node_arguments(collection, object, message)
corrector.replace(node.loc.expression, "refute_includes(#{replacement})")
replacement = [collection, actual].map(&:source).join(', ')
corrector.replace(first_argument_range(node), replacement)
end
end
end
Expand Down
15 changes: 7 additions & 8 deletions lib/rubocop/cop/minitest/refute_instance_of.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module Minitest
# refute_instance_of(Class, object, 'the message')
#
class RefuteInstanceOf < Cop
include ArgumentRangeHelper

MSG = 'Prefer using `refute_instance_of(%<arguments>s)` over ' \
'`refute(%<receiver>s)`.'

Expand All @@ -24,9 +26,7 @@ class RefuteInstanceOf < Cop
PATTERN

def on_send(node)
refute_with_instance_of(node) do
|first_receiver_arg, object, method, rest_args|

refute_with_instance_of(node) do |first_receiver_arg, object, method, rest_args|
message = rest_args.first
arguments = node_arguments(object, method, message)
receiver = [first_receiver_arg.source, message&.source].compact.join(', ')
Expand All @@ -39,12 +39,11 @@ def on_send(node)

def autocorrect(node)
lambda do |corrector|
refute_with_instance_of(node) do |_, object, method, rest_args|
message = rest_args.first
arguments = node_arguments(object, method, message)
refute_with_instance_of(node) do |_, object, method|
corrector.replace(node.loc.selector, 'refute_instance_of')

replacement = "refute_instance_of(#{arguments})"
corrector.replace(node.loc.expression, replacement)
replacement = [method, object].map(&:source).join(', ')
corrector.replace(first_argument_range(node), replacement)
end
end
end
Expand Down
Loading

0 comments on commit 17f8f60

Please sign in to comment.