ruby/test/irb/test_helper_method.rb

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