Skip to content
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
1 change: 1 addition & 0 deletions rust/src/rbs/method_loader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class MethodLoader
String Integer Float Array Hash Symbol
TrueClass FalseClass NilClass
Range Regexp Struct Enumerable
Kernel Object
].freeze

def initialize
Expand Down
178 changes: 178 additions & 0 deletions test/kernel_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
# frozen_string_literal: true

require 'test_helper'

class KernelTest < Minitest::Test
include CLITestHelper

# ============================================
# No Error
# ============================================

def test_freeze_on_integer
source = <<~RUBY
class Freezer
def freeze_value
x = 42
x.freeze
end
end
RUBY

assert_no_check_errors(source)
end

def test_frozen_on_string
source = <<~RUBY
class Checker
def check
x = "hello"
x.frozen?
end
end
RUBY

assert_no_check_errors(source)
end

def test_tap_on_string
source = <<~RUBY
class Logger
def log
x = "hello"
x.tap
end
end
RUBY

assert_no_check_errors(source)
end

def test_object_id_on_string
source = <<~RUBY
class Inspector
def inspect_id
x = "hello"
x.object_id
end
end
RUBY

assert_no_check_errors(source)
end

def test_send_on_string
source = <<~RUBY
class Caller
def dynamic_call
x = "hello"
x.send(:upcase)
end
end
RUBY

assert_no_check_errors(source)
end

def test_kernel_methods_on_array
source = <<~RUBY
class Processor
def process
x = [1, 2, 3]
x.freeze
x.frozen?
x.object_id
end
end
RUBY

assert_no_check_errors(source)
end

def test_kernel_methods_on_hash
source = <<~RUBY
class Processor
def process
x = { a: 1 }
x.freeze
x.frozen?
x.object_id
end
end
RUBY

assert_no_check_errors(source)
end

# ============================================
# Override
# ============================================

def test_override_freeze_no_error
source = <<~RUBY
class Foo
def freeze
self
end

def bar
freeze
end
end
RUBY

assert_no_check_errors(source)
end

def test_override_hash_no_error
source = <<~RUBY
class Foo
def hash
42
end

def bar
hash.even?
end
end
RUBY

assert_no_check_errors(source)
end

# ============================================
# Error Detection (Override)
# ============================================

def test_override_freeze_return_type_error
source = <<~RUBY
class Foo
def freeze
self
end

def bar
freeze.baz
end
end
RUBY

assert_check_error(source, method_name: 'baz', receiver_type: 'Foo')
end

def test_override_hash_return_type_error
source = <<~RUBY
class Foo
def hash
42
end

def bar
hash.upcase
end
end
RUBY

assert_check_error(source, method_name: 'upcase', receiver_type: 'Integer')
end
end
18 changes: 18 additions & 0 deletions test/method_loader_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# frozen_string_literal: true

require 'test_helper'

class MethodLoaderTest < Minitest::Test
def setup
require_relative '../rust/src/rbs/method_loader'
@loader = Rbs::MethodLoader.new
@results = @loader.load_methods
end

def test_existing_classes_still_loaded
loaded_classes = @results.map { |r| r[:receiver_class] }.uniq
%w[String Integer Float Array Hash Symbol Kernel Object].each do |cls|
assert_includes loaded_classes, cls, "#{cls} should be loaded"
end
end
end
Loading