summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2020-08-06 23:34:46 +0900
committeraycabta <aycabta@gmail.com>2020-08-18 14:38:01 +0900
commit1359da6ec09d60ac9aef28f2e0df4d7f712f08d3 (patch)
tree4bd30bed5941dc3ed5bf35f720d9cd2bf509a065
parent6f0ef83de7f8b9cda1bd9247a2c57b27278e3565 (diff)
[ruby/irb] Add tests about IRB history
https://github.com/ruby/irb/commit/82efd370eb
-rw-r--r--test/irb/test_history.rb131
1 files changed, 131 insertions, 0 deletions
diff --git a/test/irb/test_history.rb b/test/irb/test_history.rb
new file mode 100644
index 0000000000..dbfdf6fb2b
--- /dev/null
+++ b/test/irb/test_history.rb
@@ -0,0 +1,131 @@
+# frozen_string_literal: false
+require 'test/unit'
+
+module TestIRB
+ class TestHistory < Test::Unit::TestCase
+ def setup
+ IRB.conf[:RC_NAME_GENERATOR] = nil
+ end
+
+ def teardown
+ IRB.conf[:RC_NAME_GENERATOR] = nil
+ end
+
+ def test_history_save_1
+ result_output, result_history_file = launch_irb_with_irbrc_and_irb_history(<<~IRBRC, <<~IRB_HISTORY) do |stdin|
+ IRB.conf[:USE_READLINE] = true
+ IRB.conf[:SAVE_HISTORY] = 1
+ IRBRC
+ 1
+ 2
+ 3
+ 4
+ IRB_HISTORY
+ stdin.write("5\nexit\n")
+ end
+
+ assert_equal(<<~HISTORY_FILE, result_history_file)
+ exit
+ HISTORY_FILE
+ end
+
+ def test_history_save_100
+ result_output, result_history_file = launch_irb_with_irbrc_and_irb_history(<<~IRBRC, <<~IRB_HISTORY) do |stdin|
+ IRB.conf[:USE_READLINE] = true
+ IRB.conf[:SAVE_HISTORY] = 100
+ IRBRC
+ 1
+ 2
+ 3
+ 4
+ IRB_HISTORY
+ stdin.write("5\nexit\n")
+ end
+
+ assert_equal(<<~HISTORY_FILE, result_history_file)
+ 1
+ 2
+ 3
+ 4
+ 5
+ exit
+ HISTORY_FILE
+ end
+
+ private
+
+ def launch_irb_with_irbrc_and_irb_history(irbrc, irb_history)
+ result = nil
+ result_history = nil
+ backup_irbrc = ENV.delete("IRBRC")
+ backup_home = ENV["HOME"]
+ Dir.mktmpdir("test_irb_history_#{$$}") do |tmpdir|
+ ENV["HOME"] = tmpdir
+ open(IRB.rc_file, "w") do |f|
+ f.write(irbrc)
+ end
+ open(IRB.rc_file("_history"), "w") do |f|
+ f.write(irb_history)
+ end
+
+ with_temp_stdio do |stdin, stdout|
+ replace_stdio(stdin.path, stdout.path) do
+ bundle_exec = ENV.key?('BUNDLE_GEMFILE') ? ['-rbundler/setup'] : []
+ cmds = %W[ruby] + bundle_exec + %W[-W0 -rirb -e 'IRB.start(__FILE__)']
+ yield(stdin, stdout)
+ stdin.close
+ system(cmds.join(' '))
+ stdout.flush
+ result = stdout.read
+ stdout.close
+ end
+ end
+ open(IRB.rc_file("_history"), "r") do |f|
+ result_history = f.read
+ end
+ end
+ [result, result_history]
+ ensure
+ ENV["HOME"] = backup_home
+ ENV["IRBRC"] = backup_irbrc
+ end
+
+ def with_temp_stdio
+ Tempfile.create("test_readline_stdin") do |stdin|
+ Tempfile.create("test_readline_stdout") do |stdout|
+ yield stdin, stdout
+ if /mswin|mingw/ =~ RUBY_PLATFORM
+ # needed since readline holds refs to tempfiles, can't delete on Windows
+ #Readline.input = STDIN
+ #Readline.output = STDOUT
+ end
+ end
+ end
+ end
+
+ def replace_stdio(stdin_path, stdout_path)
+ open(stdin_path, "r") do |stdin|
+ open(stdout_path, "w") do |stdout|
+ orig_stdin = STDIN.dup
+ orig_stdout = STDOUT.dup
+ orig_stderr = STDERR.dup
+ STDIN.reopen(stdin)
+ STDOUT.reopen(stdout)
+ STDERR.reopen(stdout)
+ begin
+ #Readline.input = STDIN
+ #Readline.output = STDOUT
+ yield
+ ensure
+ STDERR.reopen(orig_stderr)
+ STDIN.reopen(orig_stdin)
+ STDOUT.reopen(orig_stdout)
+ orig_stdin.close
+ orig_stdout.close
+ orig_stderr.close
+ end
+ end
+ end
+ end
+ end
+end