Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fix #42] Fix an incorrect autocorrect for some cops of Minitest #44

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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