aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2020-09-16 11:19:06 +0900
committernagachika <nagachika@ruby-lang.org>2020-09-16 21:07:25 +0900
commit3bb503e0e8f92c039ce50f430b14649a36c03feb (patch)
treecf88e25a2d373ed72fa46c4998de5fa12abd1f97 /test
parented39078d37e16b541d717cd87cacb21aa33e6ef1 (diff)
downloadruby-3bb503e0e8f92c039ce50f430b14649a36c03feb.tar.gz
Merge Reline 0.1.5
Diffstat (limited to 'test')
-rw-r--r--test/reline/test_config.rb107
-rw-r--r--test/reline/test_history.rb20
-rw-r--r--test/reline/test_key_actor_emacs.rb154
-rw-r--r--test/reline/test_key_stroke.rb19
-rw-r--r--test/reline/test_reline.rb38
-rw-r--r--test/reline/test_within_pipe.rb13
-rw-r--r--test/reline/yamatanooroti/test_rendering.rb193
7 files changed, 528 insertions, 16 deletions
diff --git a/test/reline/test_config.rb b/test/reline/test_config.rb
index cecb364f89..c1455cd136 100644
--- a/test/reline/test_config.rb
+++ b/test/reline/test_config.rb
@@ -36,6 +36,51 @@ class Reline::Config::Test < Reline::TestCase
assert_equal true, @config.instance_variable_get(:@disable_completion)
end
+ def test_string_value
+ @config.read_lines(<<~LINES.lines)
+ set show-mode-in-prompt on
+ set emacs-mode-string Emacs
+ LINES
+
+ assert_equal 'Emacs', @config.instance_variable_get(:@emacs_mode_string)
+ end
+
+ def test_string_value_with_brackets
+ @config.read_lines(<<~LINES.lines)
+ set show-mode-in-prompt on
+ set emacs-mode-string [Emacs]
+ LINES
+
+ assert_equal '[Emacs]', @config.instance_variable_get(:@emacs_mode_string)
+ end
+
+ def test_string_value_with_brackets_and_quotes
+ @config.read_lines(<<~LINES.lines)
+ set show-mode-in-prompt on
+ set emacs-mode-string "[Emacs]"
+ LINES
+
+ assert_equal '[Emacs]', @config.instance_variable_get(:@emacs_mode_string)
+ end
+
+ def test_string_value_with_parens
+ @config.read_lines(<<~LINES.lines)
+ set show-mode-in-prompt on
+ set emacs-mode-string (Emacs)
+ LINES
+
+ assert_equal '(Emacs)', @config.instance_variable_get(:@emacs_mode_string)
+ end
+
+ def test_string_value_with_parens_and_quotes
+ @config.read_lines(<<~LINES.lines)
+ set show-mode-in-prompt on
+ set emacs-mode-string "(Emacs)"
+ LINES
+
+ assert_equal '(Emacs)', @config.instance_variable_get(:@emacs_mode_string)
+ end
+
def test_comment_line
@config.read_lines([" #a: error\n"])
assert_not_include @config.key_bindings, nil
@@ -213,6 +258,68 @@ class Reline::Config::Test < Reline::TestCase
assert_nothing_raised do
@config.read
end
+ ensure
+ ENV['INPUTRC'] = inputrc_backup
+ end
+
+ def test_inputrc
+ inputrc_backup = ENV['INPUTRC']
+ expected = "#{@tmpdir}/abcde"
+ ENV['INPUTRC'] = expected
+ assert_equal expected, @config.inputrc_path
+ ensure
ENV['INPUTRC'] = inputrc_backup
end
+
+ def test_xdg_config_home
+ home_backup = ENV['HOME']
+ xdg_config_home_backup = ENV['XDG_CONFIG_HOME']
+ xdg_config_home = File.expand_path("#{@tmpdir}/.config/example_dir")
+ expected = File.expand_path("#{xdg_config_home}/readline/inputrc")
+ FileUtils.mkdir_p(File.dirname(expected))
+ FileUtils.touch(expected)
+ ENV['HOME'] = @tmpdir
+ ENV['XDG_CONFIG_HOME'] = xdg_config_home
+ assert_equal expected, @config.inputrc_path
+ ensure
+ FileUtils.rm(expected)
+ ENV['XDG_CONFIG_HOME'] = xdg_config_home_backup
+ ENV['HOME'] = home_backup
+ end
+
+ def test_empty_xdg_config_home
+ home_backup = ENV['HOME']
+ xdg_config_home_backup = ENV['XDG_CONFIG_HOME']
+ ENV['HOME'] = @tmpdir
+ ENV['XDG_CONFIG_HOME'] = ''
+ expected = File.expand_path('~/.config/readline/inputrc')
+ FileUtils.mkdir_p(File.dirname(expected))
+ FileUtils.touch(expected)
+ assert_equal expected, @config.inputrc_path
+ ensure
+ FileUtils.rm(expected)
+ ENV['XDG_CONFIG_HOME'] = xdg_config_home_backup
+ ENV['HOME'] = home_backup
+ end
+
+ def test_relative_xdg_config_home
+ home_backup = ENV['HOME']
+ xdg_config_home_backup = ENV['XDG_CONFIG_HOME']
+ ENV['HOME'] = @tmpdir
+ expected = File.expand_path('~/.config/readline/inputrc')
+ FileUtils.mkdir_p(File.dirname(expected))
+ FileUtils.touch(expected)
+ result = Dir.chdir(@tmpdir) do
+ xdg_config_home = ".config/example_dir"
+ ENV['XDG_CONFIG_HOME'] = xdg_config_home
+ inputrc = "#{xdg_config_home}/readline/inputrc"
+ FileUtils.mkdir_p(File.dirname(inputrc))
+ FileUtils.touch(inputrc)
+ @config.inputrc_path
+ end
+ assert_equal expected, result
+ FileUtils.rm(expected)
+ ENV['XDG_CONFIG_HOME'] = xdg_config_home_backup
+ ENV['HOME'] = home_backup
+ end
end
diff --git a/test/reline/test_history.rb b/test/reline/test_history.rb
index 189f2db86d..58c240fc96 100644
--- a/test/reline/test_history.rb
+++ b/test/reline/test_history.rb
@@ -242,6 +242,26 @@ class Reline::History::Test < Reline::TestCase
end
end
+ def test_history_size_zero
+ history = history_new(history_size: 0)
+ assert_equal 0, history.size
+ history << 'aa'
+ history << 'bb'
+ assert_equal 0, history.size
+ history.push(*%w{aa bb cc})
+ assert_equal 0, history.size
+ end
+
+ def test_history_size_negative_unlimited
+ history = history_new(history_size: -1)
+ assert_equal 0, history.size
+ history << 'aa'
+ history << 'bb'
+ assert_equal 2, history.size
+ history.push(*%w{aa bb cc})
+ assert_equal 5, history.size
+ end
+
private
def history_new(history_size: 10)
diff --git a/test/reline/test_key_actor_emacs.rb b/test/reline/test_key_actor_emacs.rb
index c16212c626..a1e4015999 100644
--- a/test/reline/test_key_actor_emacs.rb
+++ b/test/reline/test_key_actor_emacs.rb
@@ -1625,7 +1625,7 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
assert_line('')
end
- def test_ed_search_prev_history
+ def test_vi_search_prev
Reline::HISTORY.concat(%w{abc 123 AAA})
assert_line('')
assert_byte_pointer_size('')
@@ -1897,12 +1897,162 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
end
def test_modify_lines_with_wrong_rs
+ verbose, $VERBOSE = $VERBOSE, nil
original_global_slash = $/
$/ = 'b'
+ $VERBOSE = verbose
@line_editor.output_modifier_proc = proc { |output| Reline::Unicode.escape_for_print(output) }
input_keys("abcdef\n")
- assert_equal(['abcdef'], @line_editor.__send__(:modify_lines, @line_editor.whole_lines))
+ result = @line_editor.__send__(:modify_lines, @line_editor.whole_lines)
+ $/ = nil
+ assert_equal(['abcdef'], result)
+ ensure
+ $VERBOSE = nil
$/ = original_global_slash
+ $VERBOSE = verbose
+ end
+
+ def test_ed_search_prev_history
+ Reline::HISTORY.concat([
+ '12356', # old
+ '12aaa',
+ '12345' # new
+ ])
+ input_keys('123')
+ # The ed_search_prev_history doesn't have default binding
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('123')
+ assert_cursor(3)
+ assert_cursor_max(5)
+ assert_line('12345')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('123')
+ assert_cursor(3)
+ assert_cursor_max(5)
+ assert_line('12356')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('123')
+ assert_cursor(3)
+ assert_cursor_max(5)
+ assert_line('12356')
+ end
+
+ def test_ed_search_prev_history_with_empty
+ Reline::HISTORY.concat([
+ '12356', # old
+ '12aaa',
+ '12345' # new
+ ])
+ # The ed_search_prev_history doesn't have default binding
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12345')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12aaa')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12356')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12356')
+ end
+
+ def test_ed_search_prev_history_without_match
+ Reline::HISTORY.concat([
+ '12356', # old
+ '12aaa',
+ '12345' # new
+ ])
+ input_keys('ABC')
+ # The ed_search_prev_history doesn't have default binding
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('ABC')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ assert_line('ABC')
+ end
+
+ def test_ed_search_next_history
+ Reline::HISTORY.concat([
+ '12356', # old
+ '12aaa',
+ '12345' # new
+ ])
+ input_keys('123')
+ # The ed_search_prev_history and ed_search_next_history doesn't have default binding
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('123')
+ assert_cursor(3)
+ assert_cursor_max(5)
+ assert_line('12345')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('123')
+ assert_cursor(3)
+ assert_cursor_max(5)
+ assert_line('12356')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('123')
+ assert_cursor(3)
+ assert_cursor_max(5)
+ assert_line('12356')
+ @line_editor.__send__(:ed_search_next_history, "\C-n".ord)
+ assert_byte_pointer_size('123')
+ assert_cursor(3)
+ assert_cursor_max(5)
+ assert_line('12345')
+ @line_editor.__send__(:ed_search_next_history, "\C-n".ord)
+ assert_byte_pointer_size('123')
+ assert_cursor(3)
+ assert_cursor_max(5)
+ assert_line('12345')
+ end
+
+ def test_ed_search_next_history_with_empty
+ Reline::HISTORY.concat([
+ '12356', # old
+ '12aaa',
+ '12345' # new
+ ])
+ # The ed_search_prev_history and ed_search_next_history doesn't have default binding
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12345')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12aaa')
+ @line_editor.__send__(:ed_search_prev_history, "\C-p".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12356')
+ @line_editor.__send__(:ed_search_next_history, "\C-n".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12aaa')
+ @line_editor.__send__(:ed_search_next_history, "\C-n".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(5)
+ assert_line('12345')
+ @line_editor.__send__(:ed_search_next_history, "\C-n".ord)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
end
=begin # TODO: move KeyStroke instance from Reline to LineEditor
diff --git a/test/reline/test_key_stroke.rb b/test/reline/test_key_stroke.rb
index 224e93d9a0..15675a9b5a 100644
--- a/test/reline/test_key_stroke.rb
+++ b/test/reline/test_key_stroke.rb
@@ -16,10 +16,10 @@ class Reline::KeyStroke::Test < Reline::TestCase
def test_match_status
config = Reline::Config.new
{
- "a" => "xx",
- "ab" => "y",
- "abc" => "z",
- "x" => "rr"
+ 'a' => 'xx',
+ 'ab' => 'y',
+ 'abc' => 'z',
+ 'x' => 'rr'
}.each_pair do |key, func|
config.add_default_key_binding(key.bytes, func.bytes)
end
@@ -35,4 +35,15 @@ class Reline::KeyStroke::Test < Reline::TestCase
assert_equal(:unmatched, stroke.match_status("m".bytes))
assert_equal(:matched, stroke.match_status("abzwabk".bytes))
end
+
+ def test_aaa
+ config = Reline::Config.new
+ {
+ 'abc' => '123',
+ }.each_pair do |key, func|
+ config.add_default_key_binding(key.bytes, func.bytes)
+ end
+ stroke = Reline::KeyStroke.new(config)
+ assert_equal('123'.bytes, stroke.expand('abc'.bytes))
+ end
end
diff --git a/test/reline/test_reline.rb b/test/reline/test_reline.rb
index 0de2462a08..d2de4690d5 100644
--- a/test/reline/test_reline.rb
+++ b/test/reline/test_reline.rb
@@ -7,6 +7,12 @@ class Reline::Test < Reline::TestCase
end
def setup
+ Reline.output_modifier_proc = nil
+ Reline.completion_proc = nil
+ Reline.prompt_proc = nil
+ Reline.auto_indent_proc = nil
+ Reline.pre_input_hook = nil
+ Reline.dig_perfect_match_proc = nil
end
def teardown
@@ -14,6 +20,8 @@ class Reline::Test < Reline::TestCase
end
def test_completion_append_character
+ completion_append_character = Reline.completion_append_character
+
assert_equal(nil, Reline.completion_append_character)
Reline.completion_append_character = ""
@@ -33,57 +41,85 @@ class Reline::Test < Reline::TestCase
Reline.completion_append_character = nil
assert_equal(nil, Reline.completion_append_character)
+ ensure
+ Reline.completion_append_character = completion_append_character
end
def test_basic_word_break_characters
+ basic_word_break_characters = Reline.basic_word_break_characters
+
assert_equal(" \t\n`><=;|&{(", Reline.basic_word_break_characters)
Reline.basic_word_break_characters = "[".encode(Encoding::ASCII)
assert_equal("[", Reline.basic_word_break_characters)
assert_equal(get_reline_encoding, Reline.basic_word_break_characters.encoding)
+ ensure
+ Reline.basic_word_break_characters = basic_word_break_characters
end
def test_completer_word_break_characters
+ completer_word_break_characters = Reline.completer_word_break_characters
+
assert_equal(" \t\n`><=;|&{(", Reline.completer_word_break_characters)
Reline.completer_word_break_characters = "[".encode(Encoding::ASCII)
assert_equal("[", Reline.completer_word_break_characters)
assert_equal(get_reline_encoding, Reline.completer_word_break_characters.encoding)
+ ensure
+ Reline.completer_word_break_characters = completer_word_break_characters
end
def test_basic_quote_characters
+ basic_quote_characters = Reline.basic_quote_characters
+
assert_equal('"\'', Reline.basic_quote_characters)
Reline.basic_quote_characters = "`".encode(Encoding::ASCII)
assert_equal("`", Reline.basic_quote_characters)
assert_equal(get_reline_encoding, Reline.basic_quote_characters.encoding)
+ ensure
+ Reline.basic_quote_characters = basic_quote_characters
end
def test_completer_quote_characters
+ completer_quote_characters = Reline.completer_quote_characters
+
assert_equal('"\'', Reline.completer_quote_characters)
Reline.completer_quote_characters = "`".encode(Encoding::ASCII)
assert_equal("`", Reline.completer_quote_characters)
assert_equal(get_reline_encoding, Reline.completer_quote_characters.encoding)
+ ensure
+ Reline.completer_quote_characters = completer_quote_characters
end
def test_filename_quote_characters
+ filename_quote_characters = Reline.filename_quote_characters
+
assert_equal('', Reline.filename_quote_characters)
Reline.filename_quote_characters = "\'".encode(Encoding::ASCII)
assert_equal("\'", Reline.filename_quote_characters)
assert_equal(get_reline_encoding, Reline.filename_quote_characters.encoding)
+ ensure
+ Reline.filename_quote_characters = filename_quote_characters
end
def test_special_prefixes
+ special_prefixes = Reline.special_prefixes
+
assert_equal('', Reline.special_prefixes)
Reline.special_prefixes = "\'".encode(Encoding::ASCII)
assert_equal("\'", Reline.special_prefixes)
assert_equal(get_reline_encoding, Reline.special_prefixes.encoding)
+ ensure
+ Reline.special_prefixes = special_prefixes
end
def test_completion_case_fold
+ completion_case_fold = Reline.completion_case_fold
+
assert_equal(nil, Reline.completion_case_fold)
Reline.completion_case_fold = true
@@ -91,6 +127,8 @@ class Reline::Test < Reline::TestCase
Reline.completion_case_fold = "hoge".encode(Encoding::ASCII)
assert_equal("hoge", Reline.completion_case_fold)
+ ensure
+ Reline.completion_case_fold = completion_case_fold
end
def test_completion_proc
diff --git a/test/reline/test_within_pipe.rb b/test/reline/test_within_pipe.rb
index 46b4465f32..53989a794f 100644
--- a/test/reline/test_within_pipe.rb
+++ b/test/reline/test_within_pipe.rb
@@ -3,9 +3,10 @@ require_relative 'helper'
class Reline::WithinPipeTest < Reline::TestCase
def setup
Reline.send(:test_mode)
- @reader, @writer = IO.pipe((RELINE_TEST_ENCODING rescue Encoding.default_external))
- Reline.input = @reader
- @output = Reline.output = File.open(IO::NULL, 'w')
+ @input_reader, @writer = IO.pipe((RELINE_TEST_ENCODING rescue Encoding.default_external))
+ Reline.input = @input_reader
+ @reader, @output_writer = IO.pipe((RELINE_TEST_ENCODING rescue Encoding.default_external))
+ @output = Reline.output = @output_writer
@config = Reline.send(:core).config
@line_editor = Reline.send(:core).line_editor
end
@@ -14,9 +15,11 @@ class Reline::WithinPipeTest < Reline::TestCase
Reline.input = STDIN
Reline.output = STDOUT
Reline.point = 0
- @reader.close
+ Reline.delete_text
+ @input_reader.close
@writer.close
- @output.close
+ @reader.close
+ @output_writer.close
@config.reset
end
diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb
index 4eab6661d6..0ab43fa60c 100644
--- a/test/reline/yamatanooroti/test_rendering.rb
+++ b/test/reline/yamatanooroti/test_rendering.rb
@@ -5,14 +5,29 @@ begin
class Reline::TestRendering < Yamatanooroti::TestCase
def setup
- inputrc_backup = ENV['INPUTRC']
- ENV['INPUTRC'] = 'nonexistent_file'
- start_terminal(5, 30, %w{ruby -Ilib bin/multiline_repl})
- sleep 0.5
- ENV['INPUTRC'] = inputrc_backup
+ @pwd = Dir.pwd
+ @tmpdir = File.join(File.expand_path(Dir.tmpdir), "test_reline_config_#{$$}")
+ begin
+ Dir.mkdir(@tmpdir)
+ rescue Errno::EEXIST
+ FileUtils.rm_rf(@tmpdir)
+ Dir.mkdir(@tmpdir)
+ end
+ Dir.chdir(@tmpdir)
+ @inputrc_backup = ENV['INPUTRC']
+ @inputrc_file = ENV['INPUTRC'] = File.join(@tmpdir, 'temporaty_inputrc')
+ File.unlink(@inputrc_file) if File.exist?(@inputrc_file)
+ end
+
+ def teardown
+ Dir.chdir(@pwd)
+ FileUtils.rm_rf(@tmpdir)
+ ENV['INPUTRC'] = @inputrc_backup
end
def test_history_back
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
write(":a\n")
write("\C-p")
close
@@ -25,6 +40,8 @@ begin
end
def test_backspace
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
write(":abc\C-h\n")
close
assert_screen(<<~EOC)
@@ -34,6 +51,172 @@ begin
prompt>
EOC
end
+
+ def test_autowrap
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
+ write('01234567890123456789012')
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ prompt> 0123456789012345678901
+ 2
+ EOC
+ end
+
+ def test_finish_autowrapped_line
+ start_terminal(10, 40, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
+ write("[{'user'=>{'email'=>'a@a', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]\n")
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ prompt> [{'user'=>{'email'=>'a@a', 'id'=
+ >'ABC'}, 'version'=>4, 'status'=>'succee
+ ded'}]
+ => [{"user"=>{"email"=>"a@a", "id"=>"ABC
+ "}, "version"=>4, "status"=>"succeeded"}
+ ]
+ prompt>
+ EOC
+ end
+
+ def test_finish_autowrapped_line_in_the_middle_of_lines
+ start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
+ write("[{'user'=>{'email'=>'abcdef@abcdef', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]#{"\C-b"*7}\n")
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ prompt> [{'user'=>{'email'=>'a
+ bcdef@abcdef', 'id'=>'ABC'}, '
+ version'=>4, 'status'=>'succee
+ ded'}]
+ => [{"user"=>{"email"=>"abcdef
+ @abcdef", "id"=>"ABC"}, "versi
+ on"=>4, "status"=>"succeeded"}
+ ]
+ prompt>
+ EOC
+ end
+
+ def test_finish_autowrapped_line_in_the_middle_of_multilines
+ start_terminal(30, 16, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
+ write("<<~EOM\n ABCDEFG\nEOM\n")
+ close
+ assert_screen(<<~'EOC')
+ Multiline REPL.
+ prompt> <<~EOM
+ prompt> ABCDEF
+ G
+ prompt> EOM
+ => "ABCDEFG\n"
+ prompt>
+ EOC
+ end
+
+ def test_prompt
+ File.open(@inputrc_file, 'w') do |f|
+ f.write <<~'LINES'
+ "abc": "123"
+ LINES
+ end
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
+ write("abc\n")
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ prompt> 123
+ => 123
+ prompt>
+ EOC
+ end
+
+ def test_mode_icon_emacs
+ File.open(@inputrc_file, 'w') do |f|
+ f.write <<~LINES
+ set show-mode-in-prompt on
+ LINES
+ end
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ @prompt>
+ EOC
+ end
+
+ def test_mode_icon_vi
+ File.open(@inputrc_file, 'w') do |f|
+ f.write <<~LINES
+ set editing-mode vi
+ set show-mode-in-prompt on
+ LINES
+ end
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ sleep 0.5
+ write(":a\n\C-[k")
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ (ins)prompt> :a
+ => :a
+ (cmd)prompt> :a
+ EOC
+ end
+
+ def test_original_mode_icon_emacs
+ File.open(@inputrc_file, 'w') do |f|
+ f.write <<~LINES
+ set show-mode-in-prompt on
+ set emacs-mode-string [emacs]
+ LINES
+ end
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ [emacs]prompt>
+ EOC
+ end
+
+ def test_original_mode_icon_with_quote
+ File.open(@inputrc_file, 'w') do |f|
+ f.write <<~LINES
+ set show-mode-in-prompt on
+ set emacs-mode-string "[emacs]"
+ LINES
+ end
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ [emacs]prompt>
+ EOC
+ end
+
+ def test_original_mode_icon_vi
+ File.open(@inputrc_file, 'w') do |f|
+ f.write <<~LINES
+ set editing-mode vi
+ set show-mode-in-prompt on
+ set vi-ins-mode-string "{InS}"
+ set vi-cmd-mode-string "{CmD}"
+ LINES
+ end
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl})
+ write(":a\n\C-[k")
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ {InS}prompt> :a
+ => :a
+ {CmD}prompt> :a
+ EOC
+ end
end
rescue LoadError, NameError
# On Ruby repository, this test suit doesn't run because Ruby repo doesn't