Skip to content

Commit

Permalink
wip [skip ci]
Browse files Browse the repository at this point in the history
  • Loading branch information
andyw8 committed Feb 14, 2025
1 parent c4d7e7b commit c31bee6
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 0 deletions.
85 changes: 85 additions & 0 deletions lib/minitest/reporters/ruby_lsp_reporter.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# typed: strict
# frozen_string_literal: true

require "ruby_lsp/test_reporting"

module Minitest
module Reporters
class RubyLspReporter < ::Minitest::Reporters::BaseReporter
extend T::Sig

sig { void }
def initialize
@reporting = T.let(RubyLsp::TestReporting.new, RubyLsp::TestReporting)
super()
end

sig { params(test: Minitest::Test).void }
def before_test(test)
@reporting.before_test(class_name: T.must(test.class.name), test_name: test.name)
super
end

sig { params(test: Minitest::Test).void }
def after_test(test)
@reporting.after_test(class_name: T.must(test.class.name), test_name: test.name)
super
end

# TODO: why is this needed if already defined in BaseReporter?
sig { params(test: Minitest::Result).void }
def record(test)
super

on_record(test)
end

sig { params(test: Minitest::Result).void }
def on_record(test)
if test.passed?
record_pass(test)
elsif test.skipped?
record_skip(test)
elsif test.failure
record_fail(test)
end
end

sig { params(result: Minitest::Result).void }
def record_pass(result)
info = {
test_name: result.name,
class_name: result.klass,
file: result.source_location[0],
line: result.source_location[1],
}
@reporting.record_pass(**info)
end

sig { params(result: Minitest::Result).void }
def record_skip(result)
info = {
test_name: result.name,
class_name: result.klass,
message: result.failure.message,
file: result.source_location[0],
line: result.source_location[1],
}
@reporting.record_skip(**info)
end

sig { params(result: Minitest::Result).void }
def record_fail(result)
info = {
class_name: result.klass,
test_name: result.name,
type: result.failure.class.name,
message: result.failure.message,
file: result.source_location[0],
line: result.source_location[1],
}
@reporting.record_fail(**info)
end
end
end
end
78 changes: 78 additions & 0 deletions lib/ruby_lsp/test_reporting.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# typed: strict
# frozen_string_literal: true

require "json"

module RubyLsp
class TestReporting
extend T::Sig

sig { params(class_name: String, test_name: String).void }
def before_test(class_name:, test_name:)
full_name = "#{class_name}##{test_name}"
result = {
event: "before_test",
full_name: full_name,
}
puts result.to_json
end

sig { params(class_name: String, test_name: String).void }
def after_test(class_name:, test_name:)
full_name = "#{class_name}##{test_name}"
result = {
event: "after_test",
full_name: full_name,
}
puts result.to_json
end

sig { params(class_name: String, test_name: String, file: String, line: Integer).void }
def record_pass(class_name:, test_name:, file:, line:)
full_name = "#{class_name}##{test_name}"
result = {
event: "pass",
full_name: full_name,
file: file,
line: line,
}
puts result.to_json
end

# TODO: type
sig do
params(
class_name: String,
test_name: String,
type: T.untyped,
message: String,
file: String,
line: Integer,
).void
end
def record_fail(class_name:, test_name:, type:, message:, file:, line:)
result = {
event: "fail",
type: type,
message: message,
class_name: class_name,
test_name: test_name,
file: file,
line: line,
}
puts result.to_json
end

sig { params(class_name: String, test_name: String, message: T.nilable(String), file: String, line: Integer).void }
def record_skip(class_name:, test_name:, message:, file:, line:)
result = {
event: "skip",
message: message,
classname: class_name,
file: file,
line: line,
}
puts result.to_json
end
end
end
3 changes: 3 additions & 0 deletions sorbet/tapioca/require.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,6 @@
require "rubocop/minitest/assert_offense"
require "syntax_tree/cli"
require "spoom/backtrace_filter/minitest"
require "test/unit/ui/testrunner"
require "test/unit/testresult"
require "test/unit/ui/testrunnermediator"
1 change: 1 addition & 0 deletions test/global_state_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ def test_detects_minitest
end

def test_does_not_detect_minitest_related_gems_as_minitest
skip("no thank you") # temporary to verify test reporter
stub_direct_dependencies("minitest-reporters" => "1.2.3")

state = GlobalState.new
Expand Down
5 changes: 5 additions & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@
end
Minitest::Reporters.use!(minitest_reporter)

if ENV["RUBY_LSP"]
require "minitest/reporters/ruby_lsp_reporter"
Minitest::Reporters.use!(Minitest::Reporters::RubyLspReporter.new)
end

module Minitest
class Test
extend T::Sig
Expand Down

0 comments on commit c31bee6

Please sign in to comment.