Skip to content

Commit

Permalink
Use Cop::Base API for Minitest department
Browse files Browse the repository at this point in the history
Follow rubocop/rubocop#7868.

This PR uses `Cop::Base` API for `Minitest` department's cops.
  • Loading branch information
koic committed Apr 5, 2021
1 parent aaba1f7 commit dd6308b
Show file tree
Hide file tree
Showing 35 changed files with 152 additions and 189 deletions.
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_empty.rb
Expand Up @@ -15,7 +15,7 @@ module Minitest
# assert_empty(object)
# assert_empty(object, 'message')
#
class AssertEmpty < Cop
class AssertEmpty < Base
extend MinitestCopRule

define_rule :assert, target_method: :empty?
Expand Down
13 changes: 4 additions & 9 deletions lib/rubocop/cop/minitest/assert_empty_literal.rb
Expand Up @@ -14,8 +14,9 @@ module Minitest
# # good
# assert_empty(object)
#
class AssertEmptyLiteral < Cop
class AssertEmptyLiteral < Base
include ArgumentRangeHelper
extend AutoCorrector

MSG = 'Prefer using `assert_empty(%<arguments>s)` over ' \
'`assert_equal(%<literal>s, %<arguments>s)`.'
Expand All @@ -32,15 +33,9 @@ def on_send(node)
args = matchers.map(&:source).join(', ')

message = format(MSG, literal: literal.source, arguments: args)
add_offense(node, message: message)
end
end

def autocorrect(node)
assert_equal_with_empty_literal(node) do |_literal, matchers|
object = matchers.first
add_offense(node, message: message) do |corrector|
object = matchers.first

lambda do |corrector|
corrector.replace(node.loc.selector, 'assert_empty')
corrector.replace(first_and_second_arguments_range(node), object.source)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_equal.rb
Expand Up @@ -13,7 +13,7 @@ module Minitest
# # good
# assert_equal("rubocop-minitest", actual)
#
class AssertEqual < Cop
class AssertEqual < Base
extend MinitestCopRule

define_rule :assert, target_method: :==, preferred_method: :assert_equal
Expand Down
3 changes: 2 additions & 1 deletion lib/rubocop/cop/minitest/assert_in_delta.rb
Expand Up @@ -15,8 +15,9 @@ module Minitest
# assert_in_delta(0.2, actual)
# assert_in_delta(0.2, actual, 0.001, 'message')
#
class AssertInDelta < Cop
class AssertInDelta < Base
include InDeltaMixin
extend AutoCorrector

RESTRICT_ON_SEND = %i[assert_equal].freeze

Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_includes.rb
Expand Up @@ -15,7 +15,7 @@ module Minitest
# assert_includes(collection, object)
# assert_includes(collection, object, 'message')
#
class AssertIncludes < Cop
class AssertIncludes < Base
extend MinitestCopRule

define_rule :assert, target_method: :include?, preferred_method: :assert_includes
Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_instance_of.rb
Expand Up @@ -15,7 +15,7 @@ module Minitest
# assert_instance_of(Class, object)
# assert_instance_of(Class, object, 'message')
#
class AssertInstanceOf < Cop
class AssertInstanceOf < Base
extend MinitestCopRule

define_rule :assert, target_method: :instance_of?, inverse: true
Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_kind_of.rb
Expand Up @@ -15,7 +15,7 @@ module Minitest
# assert_kind_of(Class, object)
# assert_kind_of(Class, object, 'message')
#
class AssertKindOf < Cop
class AssertKindOf < Base
extend MinitestCopRule

define_rule :assert, target_method: :kind_of?, inverse: true
Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_match.rb
Expand Up @@ -15,7 +15,7 @@ module Minitest
# assert_match(regex, string)
# assert_match(matcher, string, 'message')
#
class AssertMatch < Cop
class AssertMatch < Base
extend MinitestCopRule

define_rule :assert, target_method: :match
Expand Down
15 changes: 4 additions & 11 deletions lib/rubocop/cop/minitest/assert_nil.rb
Expand Up @@ -15,8 +15,9 @@ module Minitest
# assert_nil(actual)
# assert_nil(actual, 'message')
#
class AssertNil < Cop
class AssertNil < Base
include ArgumentRangeHelper
extend AutoCorrector

MSG = 'Prefer using `assert_nil(%<arguments>s)` over ' \
'`assert_equal(nil, %<arguments>s)`.'
Expand All @@ -32,17 +33,9 @@ def on_send(node)

arguments = [actual.source, message&.source].compact.join(', ')

add_offense(node, message: format(MSG, arguments: arguments))
end
end

def autocorrect(node)
lambda do |corrector|
assert_equal_with_nil(node) do |actual|
add_offense(node, message: format(MSG, arguments: arguments)) do |corrector|
corrector.replace(node.loc.selector, 'assert_nil')
corrector.replace(
first_and_second_arguments_range(node), actual.source
)
corrector.replace(first_and_second_arguments_range(node), actual.source)
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_output.rb
Expand Up @@ -15,7 +15,7 @@ module Minitest
# # good
# assert_output(expected) { puts object.method }
#
class AssertOutput < Cop
class AssertOutput < Base
include MinitestExplorationHelpers

MSG = 'Use `assert_output` instead of mutating %<name>s.'
Expand Down
17 changes: 5 additions & 12 deletions lib/rubocop/cop/minitest/assert_path_exists.rb
Expand Up @@ -15,7 +15,9 @@ module Minitest
# assert_path_exists(path)
# assert_path_exists(path, 'message')
#
class AssertPathExists < Cop
class AssertPathExists < Base
extend AutoCorrector

MSG = 'Prefer using `%<good_method>s` over `%<bad_method>s`.'
RESTRICT_ON_SEND = %i[assert].freeze

Expand All @@ -32,17 +34,8 @@ def on_send(node)
good_method = build_good_method(path, failure_message)
message = format(MSG, good_method: good_method, bad_method: node.source)

add_offense(node, message: message)
end
end

def autocorrect(node)
assert_file_exists(node) do |path, failure_message|
failure_message = failure_message.first

lambda do |corrector|
replacement = build_good_method(path, failure_message)
corrector.replace(node, replacement)
add_offense(node, message: message) do |corrector|
corrector.replace(node, good_method)
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_respond_to.rb
Expand Up @@ -17,7 +17,7 @@ module Minitest
# assert_respond_to(object, :do_something, 'message')
# assert_respond_to(self, :do_something)
#
class AssertRespondTo < Cop
class AssertRespondTo < Base
extend MinitestCopRule

define_rule :assert, target_method: :respond_to?
Expand Down
14 changes: 8 additions & 6 deletions lib/rubocop/cop/minitest/assert_silent.rb
Expand Up @@ -13,7 +13,9 @@ module Minitest
# # good
# assert_silent { puts object.do_something }
#
class AssertSilent < Cop
class AssertSilent < Base
extend AutoCorrector

MSG = 'Prefer using `assert_silent` over `assert_output("", "")`.'

def_node_matcher :assert_silent_candidate?, <<~PATTERN
Expand All @@ -25,12 +27,12 @@ class AssertSilent < Cop
PATTERN

def on_block(node)
add_offense(node.send_node) if assert_silent_candidate?(node)
end
return unless assert_silent_candidate?(node)

send_node = node.send_node

def autocorrect(node)
lambda do |corrector|
corrector.replace(node, 'assert_silent')
add_offense(send_node) do |corrector|
corrector.replace(send_node, 'assert_silent')
end
end

Expand Down
15 changes: 4 additions & 11 deletions lib/rubocop/cop/minitest/assert_truthy.rb
Expand Up @@ -15,8 +15,9 @@ module Minitest
# assert(actual)
# assert(actual, 'message')
#
class AssertTruthy < Cop
class AssertTruthy < Base
include ArgumentRangeHelper
extend AutoCorrector

MSG = 'Prefer using `assert(%<arguments>s)` over ' \
'`assert_equal(true, %<arguments>s)`.'
Expand All @@ -32,17 +33,9 @@ def on_send(node)

arguments = [actual.source, message&.source].compact.join(', ')

add_offense(node, message: format(MSG, arguments: arguments))
end
end

def autocorrect(node)
lambda do |corrector|
assert_equal_with_truthy(node) do |actual|
add_offense(node, message: format(MSG, arguments: arguments)) do |corrector|
corrector.replace(node.loc.selector, 'assert')
corrector.replace(
first_and_second_arguments_range(node), actual.source
)
corrector.replace(first_and_second_arguments_range(node), actual.source)
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assert_with_expected_argument.rb
Expand Up @@ -19,7 +19,7 @@ module Minitest
# assert_equal(expected, actual)
# assert(foo, 'message')
#
class AssertWithExpectedArgument < Cop
class AssertWithExpectedArgument < Base
MSG = 'Did you mean to use `assert_equal(%<arguments>s)`?'
RESTRICT_ON_SEND = %i[assert].freeze

Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/assertion_in_lifecycle_hook.rb
Expand Up @@ -20,7 +20,7 @@ module Minitest
# end
# end
#
class AssertionInLifecycleHook < Cop
class AssertionInLifecycleHook < Base
include MinitestExplorationHelpers

MSG = 'Do not use `%<assertion>s` in `%<hook>s` hook.'
Expand Down
11 changes: 4 additions & 7 deletions lib/rubocop/cop/minitest/global_expectations.rb
Expand Up @@ -16,7 +16,9 @@ module Minitest
# _(musts).must_equal expected_musts
# _(wonts).wont_match expected_wonts
# _ { musts }.must_raise TypeError
class GlobalExpectations < Cop
class GlobalExpectations < Base
extend AutoCorrector

MSG = 'Use `%<preferred>s` instead.'

VALUE_MATCHERS = %i[
Expand Down Expand Up @@ -64,13 +66,8 @@ def on_send(node)
return unless value_global_expectation?(node) || block_global_expectation?(node)

message = format(MSG, preferred: preferred_receiver(node))
add_offense(node, location: node.receiver.source_range, message: message)
end

def autocorrect(node)
return unless value_global_expectation?(node) || block_global_expectation?(node)

lambda do |corrector|
add_offense(node.receiver.source_range, message: message) do |corrector|
receiver = node.receiver.source_range

if BLOCK_MATCHERS.include?(node.method_name)
Expand Down
28 changes: 14 additions & 14 deletions lib/rubocop/cop/minitest/literal_as_actual_argument.rb
Expand Up @@ -17,8 +17,9 @@ module Minitest
# assert_equal [1, 2], foo
# assert_equal [1, 2], foo, 'message'
#
class LiteralAsActualArgument < Cop
class LiteralAsActualArgument < Base
include ArgumentRangeHelper
extend AutoCorrector

MSG = 'Replace the literal with the first argument.'
RESTRICT_ON_SEND = %i[assert_equal].freeze
Expand All @@ -27,25 +28,24 @@ def on_send(node)
return unless node.method?(:assert_equal)

actual = node.arguments[1]
return unless actual
return unless actual&.recursive_basic_literal?

add_offense(node, location: all_arguments_range(node)) if actual.recursive_basic_literal?
add_offense(all_arguments_range(node)) do |corrector|
autocorrect(corrector, node)
end
end

def autocorrect(node)
def autocorrect(corrector, node)
expected, actual, message = *node.arguments

lambda do |corrector|
new_actual_source =
if actual.hash_type? && !actual.braces?
"{#{actual.source}}"
else
actual.source
end
arguments = [new_actual_source, expected.source, message&.source].compact.join(', ')
new_actual_source = if actual.hash_type? && !actual.braces?
"{#{actual.source}}"
else
actual.source
end
arguments = [new_actual_source, expected.source, message&.source].compact.join(', ')

corrector.replace(node, "assert_equal(#{arguments})")
end
corrector.replace(node, "assert_equal(#{arguments})")
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions lib/rubocop/cop/minitest/multiple_assertions.rb
Expand Up @@ -26,7 +26,7 @@ module Minitest
# end
# end
#
class MultipleAssertions < Cop
class MultipleAssertions < Base
include ConfigurableMax
include MinitestExplorationHelpers

Expand All @@ -43,7 +43,7 @@ def on_class(class_node)
self.max = assertions_count

message = format(MSG, total: assertions_count, max: max_assertions)
add_offense(node, location: :name, message: message)
add_offense(node.loc.name, message: message)
end
end

Expand Down
2 changes: 1 addition & 1 deletion lib/rubocop/cop/minitest/refute_empty.rb
Expand Up @@ -15,7 +15,7 @@ module Minitest
# refute_empty(object)
# refute_empty(object, 'message')
#
class RefuteEmpty < Cop
class RefuteEmpty < Base
extend MinitestCopRule

define_rule :refute, target_method: :empty?
Expand Down
12 changes: 5 additions & 7 deletions lib/rubocop/cop/minitest/refute_equal.rb
Expand Up @@ -14,8 +14,9 @@ module Minitest
# # good
# refute_equal("rubocop-minitest", actual)
#
class RefuteEqual < Cop
class RefuteEqual < Base
include ArgumentRangeHelper
extend AutoCorrector

MSG = 'Prefer using `refute_equal(%<preferred>s)` over ' \
'`assert(%<over>s)`.'
Expand All @@ -29,13 +30,10 @@ def on_send(node)
preferred, over = process_not_equal(node)
return unless preferred && over

message = format(MSG, preferred: preferred, over: over)
add_offense(node, message: message)
end
assert_not_equal(node) do |_, expected, actual|
message = format(MSG, preferred: preferred, over: over)

def autocorrect(node)
lambda do |corrector|
assert_not_equal(node) do |_, expected, actual|
add_offense(node, message: message) do |corrector|
corrector.replace(node.loc.selector, 'refute_equal')

replacement = [expected, actual].map(&:source).join(', ')
Expand Down

0 comments on commit dd6308b

Please sign in to comment.