summaryrefslogtreecommitdiff
path: root/test/irb/test_history.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/irb/test_history.rb')
-rw-r--r--test/irb/test_history.rb153
1 files changed, 153 insertions, 0 deletions
diff --git a/test/irb/test_history.rb b/test/irb/test_history.rb
new file mode 100644
index 0000000000..3591f88f59
--- /dev/null
+++ b/test/irb/test_history.rb
@@ -0,0 +1,153 @@
+# frozen_string_literal: false
+require 'test/unit'
+require 'irb'
+require 'readline'
+
+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
+ omit "Skip Editline" if /EditLine/n.match(Readline::VERSION)
+ _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
+ IRB.conf[:USE_READLINE] = true
+ 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
+ omit "Skip Editline" if /EditLine/n.match(Readline::VERSION)
+ _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
+ IRB.conf[:USE_READLINE] = true
+ 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
+
+ def test_history_save_bignum
+ omit "Skip Editline" if /EditLine/n.match(Readline::VERSION)
+ _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] = 10 ** 19
+ IRB.conf[:USE_READLINE] = true
+ 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
+
+ def test_history_save_minus_as_infinity
+ omit "Skip Editline" if /EditLine/n.match(Readline::VERSION)
+ _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 # infinity
+ IRB.conf[:USE_READLINE] = true
+ 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|
+ yield(stdin, stdout)
+ stdin.close
+ stdout.flush
+ system('ruby', '-Ilib', '-Itest', '-W0', '-rirb', '-e', 'IRB.start(__FILE__)', in: stdin.path, out: stdout.path)
+ result = stdout.read
+ stdout.close
+ 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
+ end
+ end
+ end
+ end
+end if not RUBY_PLATFORM.match?(/solaris|mswin|mingw/i)