class RuboCop::Cop::Minitest::EmptyLineBeforeAssertionMethods


assert_equal(expected, actual)
do_something
# good
assert_equal(expected, actual)
do_something
# bad
@example
Enforces empty line before assertion methods because it separates assertion phase.

def accept_previous_line?(previous_line_node, node)

def accept_previous_line?(previous_line_node, node)
  return true if previous_line_node.args_type? || node.parent.basic_conditional?
  previous_line_node.send_type? && assertion_method?(previous_line_node)
end

def heredoc?(last_argument)

def heredoc?(last_argument)
  last_argument.respond_to?(:heredoc?) && last_argument.heredoc?
end

def no_empty_line?(previous_line_node, node)

def no_empty_line?(previous_line_node, node)
  previous_line = if heredoc?(previous_line_node)
                    previous_line_node.loc.heredoc_end.line
                  else
                    previous_line_node.loc.last_line
                  end
  previous_line + 1 == node.loc.line
end

def on_send(node)

def on_send(node)
  return unless assertion_method?(node)
  return unless (previous_line_node = node.left_sibling)
  return if accept_previous_line?(previous_line_node, node)
  previous_line_node = previous_line_node.arguments.last if use_heredoc_argument?(previous_line_node)
  return unless no_empty_line?(previous_line_node, node)
  register_offense(node, previous_line_node)
end

def register_offense(node, previous_line_node)

def register_offense(node, previous_line_node)
  add_offense(node) do |corrector|
    range = if heredoc?(previous_line_node)
              previous_line_node.loc.heredoc_end
            else
              previous_line_node
            end
    corrector.insert_after(range, "\n")
  end
end

def use_heredoc_argument?(node)

def use_heredoc_argument?(node)
  node.respond_to?(:arguments) && heredoc?(node.arguments.last)
end