зеркало из https://github.com/github/ruby.git
135 строки
3.3 KiB
Ruby
135 строки
3.3 KiB
Ruby
# frozen_string_literal: true
|
|
require "irb"
|
|
|
|
require_relative "helper"
|
|
|
|
module TestIRB
|
|
class HelperMethodTestCase < TestCase
|
|
def setup
|
|
$VERBOSE = nil
|
|
@verbosity = $VERBOSE
|
|
save_encodings
|
|
IRB.instance_variable_get(:@CONF).clear
|
|
end
|
|
|
|
def teardown
|
|
$VERBOSE = @verbosity
|
|
restore_encodings
|
|
end
|
|
|
|
def execute_lines(*lines, conf: {}, main: self, irb_path: nil)
|
|
IRB.init_config(nil)
|
|
IRB.conf[:VERBOSE] = false
|
|
IRB.conf[:PROMPT_MODE] = :SIMPLE
|
|
IRB.conf.merge!(conf)
|
|
input = TestInputMethod.new(lines)
|
|
irb = IRB::Irb.new(IRB::WorkSpace.new(main), input)
|
|
irb.context.return_format = "=> %s\n"
|
|
irb.context.irb_path = irb_path if irb_path
|
|
IRB.conf[:MAIN_CONTEXT] = irb.context
|
|
IRB.conf[:USE_PAGER] = false
|
|
capture_output do
|
|
irb.eval_input
|
|
end
|
|
end
|
|
end
|
|
|
|
module TestHelperMethod
|
|
class ConfTest < HelperMethodTestCase
|
|
def test_conf_returns_the_context_object
|
|
out, err = execute_lines("conf.ap_name")
|
|
|
|
assert_empty err
|
|
assert_include out, "=> \"irb\""
|
|
end
|
|
end
|
|
end
|
|
|
|
class HelperMethodIntegrationTest < IntegrationTestCase
|
|
def test_arguments_propogation
|
|
write_ruby <<~RUBY
|
|
require "irb/helper_method"
|
|
|
|
class MyHelper < IRB::HelperMethod::Base
|
|
description "This is a test helper"
|
|
|
|
def execute(
|
|
required_arg, optional_arg = nil, *splat_arg, required_keyword_arg:,
|
|
optional_keyword_arg: nil, **double_splat_arg, &block_arg
|
|
)
|
|
puts [required_arg, optional_arg, splat_arg, required_keyword_arg, optional_keyword_arg, double_splat_arg, block_arg.call].to_s
|
|
end
|
|
end
|
|
|
|
IRB::HelperMethod.register(:my_helper, MyHelper)
|
|
|
|
binding.irb
|
|
RUBY
|
|
|
|
output = run_ruby_file do
|
|
type <<~INPUT
|
|
my_helper(
|
|
"required", "optional", "splat", required_keyword_arg: "required",
|
|
optional_keyword_arg: "optional", a: 1, b: 2
|
|
) { "block" }
|
|
INPUT
|
|
type "exit"
|
|
end
|
|
|
|
assert_include(output, '["required", "optional", ["splat"], "required", "optional", {:a=>1, :b=>2}, "block"]')
|
|
end
|
|
|
|
def test_helper_method_injection_can_happen_after_irb_require
|
|
write_ruby <<~RUBY
|
|
require "irb"
|
|
|
|
class MyHelper < IRB::HelperMethod::Base
|
|
description "This is a test helper"
|
|
|
|
def execute
|
|
puts "Hello from MyHelper"
|
|
end
|
|
end
|
|
|
|
IRB::HelperMethod.register(:my_helper, MyHelper)
|
|
|
|
binding.irb
|
|
RUBY
|
|
|
|
output = run_ruby_file do
|
|
type "my_helper"
|
|
type "exit"
|
|
end
|
|
|
|
assert_include(output, 'Hello from MyHelper')
|
|
end
|
|
|
|
def test_helper_method_instances_are_memoized
|
|
write_ruby <<~RUBY
|
|
require "irb/helper_method"
|
|
|
|
class MyHelper < IRB::HelperMethod::Base
|
|
description "This is a test helper"
|
|
|
|
def execute(val)
|
|
@val ||= val
|
|
end
|
|
end
|
|
|
|
IRB::HelperMethod.register(:my_helper, MyHelper)
|
|
|
|
binding.irb
|
|
RUBY
|
|
|
|
output = run_ruby_file do
|
|
type "my_helper(100)"
|
|
type "my_helper(200)"
|
|
type "exit"
|
|
end
|
|
|
|
assert_include(output, '=> 100')
|
|
assert_not_include(output, '=> 200')
|
|
end
|
|
end
|
|
end
|