1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
# typed: true
# frozen_string_literal: true
require "test_helper"
require_relative "support/expectations_test_runner"
class CodeActionResolveExpectationsTest < ExpectationsTestRunner
expectations_tests RubyLsp::Requests::CodeActionResolve, "code_action_resolve"
def run_expectations(source)
params = @__params&.any? ? @__params : default_args
document = RubyLsp::RubyDocument.new(
source: source,
version: 1,
uri: URI("file:///fake.rb"),
global_state: @global_state,
)
RubyLsp::Requests::CodeActionResolve.new(document, @global_state, params).perform
rescue RubyLsp::Requests::CodeActionResolve::CodeActionError
# By default, we don't specify a code action for fixtures without an expectation file since the actions are very
# specific and won't work for every case. If a fixture errors with one of our defined error classes without any
# specified refactor, that's fine. Otherwise, we re-raise
raise if params[:title]
pass
end
def assert_expectations(source, expected)
actual = run_expectations(source)
assert_equal(build_code_action(json_expectations(expected)), JSON.parse(actual.to_json))
end
private
def default_args
{
data: {
range: {
start: { line: 0, character: 1 },
end: { line: 0, character: 2 },
},
uri: "file:///fake",
},
}
end
def build_code_action(expectation)
result = LanguageServer::Protocol::Interface::CodeAction.new(
title: expectation["title"],
edit: LanguageServer::Protocol::Interface::WorkspaceEdit.new(
document_changes: [
LanguageServer::Protocol::Interface::TextDocumentEdit.new(
text_document: LanguageServer::Protocol::Interface::OptionalVersionedTextDocumentIdentifier.new(
uri: "file:///fake",
version: nil,
),
edits: build_text_edits(expectation.dig("edit", "documentChanges", 0, "edits") || []),
),
],
),
)
JSON.parse(result.to_json)
end
def build_text_edits(edits)
edits.map do |edit|
range = edit["range"]
new_text = edit["newText"]
LanguageServer::Protocol::Interface::TextEdit.new(
range: LanguageServer::Protocol::Interface::Range.new(
start: LanguageServer::Protocol::Interface::Position.new(
line: range.dig("start", "line"), character: range.dig("start", "character"),
),
end: LanguageServer::Protocol::Interface::Position.new(
line: range.dig("end", "line"), character: range.dig("end", "character"),
),
),
new_text: new_text,
)
end
end
end
|