# frozen_string_literal: false require "test/unit" require "irb" require "irb/extend-command" module TestIRB class ExtendCommand < Test::Unit::TestCase def setup @pwd = Dir.pwd @tmpdir = File.join(Dir.tmpdir, "test_reline_config_#{$$}") begin Dir.mkdir(@tmpdir) rescue Errno::EEXIST FileUtils.rm_rf(@tmpdir) Dir.mkdir(@tmpdir) end Dir.chdir(@tmpdir) @home_backup = ENV["HOME"] ENV["HOME"] = @tmpdir @default_encoding = [Encoding.default_external, Encoding.default_internal] @stdio_encodings = [STDIN, STDOUT, STDERR].map {|io| [io.external_encoding, io.internal_encoding] } IRB.instance_variable_get(:@CONF).clear end def teardown ENV["HOME"] = @home_backup Dir.chdir(@pwd) FileUtils.rm_rf(@tmpdir) EnvUtil.suppress_warning { Encoding.default_external, Encoding.default_internal = *@default_encoding [STDIN, STDOUT, STDERR].zip(@stdio_encodings) do |io, encs| io.set_encoding(*encs) end } end def test_irb_info_multiline FileUtils.touch("#{@tmpdir}/.inputrc") FileUtils.touch("#{@tmpdir}/.irbrc") IRB.setup(__FILE__, argv: []) IRB.conf[:USE_MULTILINE] = true IRB.conf[:USE_SINGLELINE] = false IRB.conf[:VERBOSE] = false workspace = IRB::WorkSpace.new(self) irb = IRB::Irb.new(workspace) IRB.conf[:MAIN_CONTEXT] = irb.context expected = %r{ Ruby\sversion: .+\n IRB\sversion:\sirb .+\n InputMethod:\sReidlineInputMethod\swith\sReline .+ and .+\n \.irbrc\spath: .+ }x assert_match expected, irb.context.main.irb_info.to_s end def test_irb_info_singleline FileUtils.touch("#{@tmpdir}/.inputrc") FileUtils.touch("#{@tmpdir}/.irbrc") IRB.setup(__FILE__, argv: []) IRB.conf[:USE_MULTILINE] = false IRB.conf[:USE_SINGLELINE] = true IRB.conf[:VERBOSE] = false workspace = IRB::WorkSpace.new(self) irb = IRB::Irb.new(workspace) IRB.conf[:MAIN_CONTEXT] = irb.context expected = %r{ Ruby\sversion: .+\n IRB\sversion:\sirb .+\n InputMethod:\sReadlineInputMethod\swith .+ and .+\n \.irbrc\spath: .+ }x assert_match expected, irb.context.main.irb_info.to_s end def test_irb_info_multiline_without_rc_files inputrc_backup = ENV["INPUTRC"] ENV["INPUTRC"] = "unknown_inpurc" ext_backup = IRB::IRBRC_EXT IRB.__send__(:remove_const, :IRBRC_EXT) IRB.const_set(:IRBRC_EXT, "unknown_ext") IRB.setup(__FILE__, argv: []) IRB.conf[:USE_MULTILINE] = true IRB.conf[:USE_SINGLELINE] = false IRB.conf[:VERBOSE] = false workspace = IRB::WorkSpace.new(self) irb = IRB::Irb.new(workspace) IRB.conf[:MAIN_CONTEXT] = irb.context expected = %r{ Ruby\sversion: .+\n IRB\sversion:\sirb .+\n InputMethod:\sReidlineInputMethod\swith\sReline\s[^ ]+(?!\sand\s.+)\n \z }x assert_match expected, irb.context.main.irb_info.to_s ensure ENV["INPUTRC"] = inputrc_backup IRB.__send__(:remove_const, :IRBRC_EXT) IRB.const_set(:IRBRC_EXT, ext_backup) end def test_irb_info_singleline_without_rc_files inputrc_backup = ENV["INPUTRC"] ENV["INPUTRC"] = "unknown_inpurc" ext_backup = IRB::IRBRC_EXT IRB.__send__(:remove_const, :IRBRC_EXT) IRB.const_set(:IRBRC_EXT, "unknown_ext") IRB.setup(__FILE__, argv: []) IRB.conf[:USE_MULTILINE] = false IRB.conf[:USE_SINGLELINE] = true IRB.conf[:VERBOSE] = false workspace = IRB::WorkSpace.new(self) irb = IRB::Irb.new(workspace) IRB.conf[:MAIN_CONTEXT] = irb.context expected = %r{ Ruby\sversion: .+\n IRB\sversion:\sirb .+\n InputMethod:\sReadlineInputMethod\swith\s(?~.*\sand\s.+)\n \z }x assert_match expected, irb.context.main.irb_info.to_s ensure ENV["INPUTRC"] = inputrc_backup IRB.__send__(:remove_const, :IRBRC_EXT) IRB.const_set(:IRBRC_EXT, ext_backup) end end end