Skip to content

Commit

Permalink
Change show_source tests into integration tests (#793)
Browse files Browse the repository at this point in the history
* Remove trailing spaces

* Migrate show_source tests to integration tests

Because show_source tests often need to define class and/or methods,
they can easily leak state to other tests. Changing them to integration
tests will ensure that they are run in a clean environment.

* Fix NoMethodError caused by SourceFinder#method_target
  • Loading branch information
st0012 authored Nov 28, 2023
1 parent eec1329 commit 3c39f13
Show file tree
Hide file tree
Showing 3 changed files with 265 additions and 228 deletions.
2 changes: 2 additions & 0 deletions lib/irb/source_finder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ def method_target(owner_receiver, s_count, method, type)
target_method = target_method.super_method if target_method
end
target_method.nil? ? nil : target_method.source_location
rescue NameError
nil
end
end
end
263 changes: 263 additions & 0 deletions test/irb/cmd/test_show_source.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
# frozen_string_literal: false
require 'irb'

require_relative "../helper"

module TestIRB
class ShowSourceTest < IntegrationTestCase
def setup
super

write_rc <<~'RUBY'
IRB.conf[:USE_PAGER] = false
RUBY
end

def test_show_source
write_ruby <<~'RUBY'
binding.irb
RUBY

out = run_ruby_file do
type "show_source IRB.conf"
type "exit"
end

assert_match(%r[/irb\/init\.rb], out)
end

def test_show_source_alias
write_ruby <<~'RUBY'
binding.irb
RUBY

out = run_ruby_file do
type "$ IRB.conf"
type "exit"
end

assert_match(%r[/irb\/init\.rb], out)
end

def test_show_source_string
write_ruby <<~'RUBY'
binding.irb
RUBY

out = run_ruby_file do
type "show_source 'IRB.conf'"
type "exit"
end

assert_match(%r[/irb\/init\.rb], out)
end

def test_show_source_method_s
write_ruby <<~RUBY
class Baz
def foo
end
end
class Bar < Baz
def foo
super
end
end
binding.irb
RUBY

out = run_ruby_file do
type "show_source Bar#foo -s"
type "exit"
end

assert_match(%r[#{@ruby_file.to_path}:2\s+def foo\r\n end\r\n], out)
end

def test_show_source_method_s_with_incorrect_signature
write_ruby <<~RUBY
class Baz
def foo
end
end
class Bar < Baz
def foo
super
end
end
binding.irb
RUBY

out = run_ruby_file do
type "show_source Bar#fooo -s"
type "exit"
end

assert_match(%r[Error: Couldn't locate a super definition for Bar#fooo], out)
end

def test_show_source_private_method
write_ruby <<~RUBY
class Bar
private def foo
end
end
binding.irb
RUBY

out = run_ruby_file do
type "show_source Bar#foo"
type "exit"
end

assert_match(%r[#{@ruby_file.to_path}:2\s+private def foo\r\n end\r\n], out)
end

def test_show_source_private_singleton_method
write_ruby <<~RUBY
class Bar
private def foo
end
end
binding.irb
RUBY

out = run_ruby_file do
type "bar = Bar.new"
type "show_source bar.foo"
type "exit"
end

assert_match(%r[#{@ruby_file.to_path}:2\s+private def foo\r\n end\r\n], out)
end

def test_show_source_method_multiple_s
write_ruby <<~RUBY
class Baz
def foo
end
end
class Bar < Baz
def foo
super
end
end
class Bob < Bar
def foo
super
end
end
binding.irb
RUBY

out = run_ruby_file do
type "show_source Bob#foo -ss"
type "exit"
end

assert_match(%r[#{@ruby_file.to_path}:2\s+def foo\r\n end\r\n], out)
end

def test_show_source_method_no_instance_method
write_ruby <<~RUBY
class Baz
end
class Bar < Baz
def foo
super
end
end
binding.irb
RUBY

out = run_ruby_file do
type "show_source Bar#foo -s"
type "exit"
end

assert_match(%r[Error: Couldn't locate a super definition for Bar#foo], out)
end

def test_show_source_method_exceeds_super_chain
write_ruby <<~RUBY
class Baz
def foo
end
end
class Bar < Baz
def foo
super
end
end
binding.irb
RUBY

out = run_ruby_file do
type "show_source Bar#foo -ss"
type "exit"
end

assert_match(%r[Error: Couldn't locate a super definition for Bar#foo], out)
end

def test_show_source_method_accidental_characters
write_ruby <<~'RUBY'
class Baz
def foo
end
end
class Bar < Baz
def foo
super
end
end
binding.irb
RUBY

out = run_ruby_file do
type "show_source Bar#foo -sddddd"
type "exit"
end

assert_match(%r[#{@ruby_file.to_path}:2\s+def foo\r\n end], out)
end

def test_show_source_receiver_super
write_ruby <<~RUBY
class Baz
def foo
end
end
class Bar < Baz
def foo
super
end
end
binding.irb
RUBY

out = run_ruby_file do
type "bar = Bar.new"
type "show_source bar.foo -s"
type "exit"
end

assert_match(%r[#{@ruby_file.to_path}:2\s+def foo\r\n end], out)
end
end
end
Loading

0 comments on commit 3c39f13

Please sign in to comment.