summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/irb/cmd/info.rb1
-rw-r--r--lib/irb/ext/loader.rb4
-rw-r--r--lib/irb/version.rb4
-rw-r--r--lib/irb/workspace.rb2
-rw-r--r--lib/reline/line_editor.rb28
-rw-r--r--lib/reline/unicode.rb1
-rw-r--r--lib/reline/version.rb2
-rw-r--r--lib/reline/windows.rb24
-rw-r--r--test/irb/test_cmd.rb8
-rw-r--r--test/irb/test_workspace.rb6
-rw-r--r--test/reline/test_key_actor_emacs.rb8
-rwxr-xr-xtest/reline/yamatanooroti/multiline_repl74
-rw-r--r--test/reline/yamatanooroti/termination_checker.rb30
-rw-r--r--test/reline/yamatanooroti/test_rendering.rb99
14 files changed, 231 insertions, 60 deletions
diff --git a/lib/irb/cmd/info.rb b/lib/irb/cmd/info.rb
index 53ec71d754..d122c88b77 100644
--- a/lib/irb/cmd/info.rb
+++ b/lib/irb/cmd/info.rb
@@ -13,6 +13,7 @@ module IRB
str += "IRB version: #{IRB.version}\n"
str += "InputMethod: #{IRB.CurrentContext.io.inspect}\n"
str += ".irbrc path: #{IRB.rc_file}\n" if File.exist?(IRB.rc_file)
+ str += "RUBY_PLATFORM: #{RUBY_PLATFORM}\n"
str
end
alias_method :to_s, :inspect
diff --git a/lib/irb/ext/loader.rb b/lib/irb/ext/loader.rb
index 90dcd70bd0..af028996e7 100644
--- a/lib/irb/ext/loader.rb
+++ b/lib/irb/ext/loader.rb
@@ -38,9 +38,9 @@ module IRB # :nodoc:
else
separator =
if File::ALT_SEPARATOR
- File::SEPARATOR
- else
"[#{Regexp.quote(File::SEPARATOR + File::ALT_SEPARATOR)}]"
+ else
+ File::SEPARATOR
end
ABSOLUTE_PATH_PATTERN = # :nodoc:
case Dir.pwd
diff --git a/lib/irb/version.rb b/lib/irb/version.rb
index a715293b34..0a4a1bb922 100644
--- a/lib/irb/version.rb
+++ b/lib/irb/version.rb
@@ -11,7 +11,7 @@
#
module IRB # :nodoc:
- VERSION = "1.3.3"
+ VERSION = "1.3.4"
@RELEASE_VERSION = VERSION
- @LAST_UPDATE_DATE = "2021-02-07"
+ @LAST_UPDATE_DATE = "2021-02-25"
end
diff --git a/lib/irb/workspace.rb b/lib/irb/workspace.rb
index c6c328e7b5..78d434d106 100644
--- a/lib/irb/workspace.rb
+++ b/lib/irb/workspace.rb
@@ -175,7 +175,7 @@ EOF
body = (start_pos..end_pos).map do |current_pos|
sprintf(fmt, pos == current_pos ? '=>' : '', current_pos + 1, lines[current_pos])
end.join("")
- "\nFrom: #{file} @ line #{pos + 1} :\n\n#{body}#{Color.clear}\n"
+ "\nFrom: #{file} @ line #{pos + 1} :\n\n#{body}#{Color.clear if use_colorize}\n"
end
def IRB.delete_caller
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index 557b5aa737..12a2bde234 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -124,6 +124,7 @@ class Reline::LineEditor
@prompt_cache_time = Time.now.to_f
end
prompt_list.map!{ prompt } if @vi_arg or @searching_prompt
+ prompt_list = [prompt] if prompt_list.empty?
mode_string = check_mode_string
prompt_list = prompt_list.map{ |pr| mode_string + pr } if mode_string
prompt = prompt_list[@line_index]
@@ -343,8 +344,9 @@ class Reline::LineEditor
else
end_of_line_cursor = new_cursor_max
end
- line_to_calc.encode(Encoding::UTF_8).grapheme_clusters.each do |gc|
- mbchar_width = Reline::Unicode.get_mbchar_width(gc)
+ line_to_calc.grapheme_clusters.each do |gc|
+ mbchar = gc.encode(Encoding::UTF_8)
+ mbchar_width = Reline::Unicode.get_mbchar_width(mbchar)
now = new_cursor + mbchar_width
if now > end_of_line_cursor or now > cursor
break
@@ -724,13 +726,17 @@ class Reline::LineEditor
Reline::IOGate.move_cursor_column(0)
if line.nil?
if calculate_width(visual_lines[index - 1], true) == Reline::IOGate.get_screen_size.last
- # Reaches the end of line.
- #
- # When the cursor is at the end of the line and erases characters
- # after the cursor, some terminals delete the character at the
- # cursor position.
- move_cursor_down(1)
- Reline::IOGate.move_cursor_column(0)
+ # reaches the end of line
+ if Reline::IOGate.win? and Reline::IOGate.win_legacy_console?
+ # A newline is automatically inserted if a character is rendered at
+ # eol on command prompt.
+ else
+ # When the cursor is at the end of the line and erases characters
+ # after the cursor, some terminals delete the character at the
+ # cursor position.
+ move_cursor_down(1)
+ Reline::IOGate.move_cursor_column(0)
+ end
else
Reline::IOGate.erase_after_cursor
move_cursor_down(1)
@@ -739,6 +745,10 @@ class Reline::LineEditor
next
end
@output.write line
+ if Reline::IOGate.win? and Reline::IOGate.win_legacy_console? and calculate_width(line, true) == Reline::IOGate.get_screen_size.last
+ # A newline is automatically inserted if a character is rendered at eol on command prompt.
+ @rest_height -= 1 if @rest_height > 0
+ end
@output.flush
if @first_prompt
@first_prompt = false
diff --git a/lib/reline/unicode.rb b/lib/reline/unicode.rb
index 9b5ddc4622..7dbe8a12a5 100644
--- a/lib/reline/unicode.rb
+++ b/lib/reline/unicode.rb
@@ -108,6 +108,7 @@ class Reline::Unicode
end
m = mbchar.encode(Encoding::UTF_8).match(MBCharWidthRE)
case
+ when m.nil? then 1 # TODO should be U+FFFD � REPLACEMENT CHARACTER
when m[:width_2_1], m[:width_2_2] then 2
when m[:width_3] then 3
when m[:width_0] then 0
diff --git a/lib/reline/version.rb b/lib/reline/version.rb
index 5b20f6f3e7..11e8145c7f 100644
--- a/lib/reline/version.rb
+++ b/lib/reline/version.rb
@@ -1,3 +1,3 @@
module Reline
- VERSION = '0.2.3'
+ VERSION = '0.2.4'
end
diff --git a/lib/reline/windows.rb b/lib/reline/windows.rb
index 4f5fcb74bc..6edc68e780 100644
--- a/lib/reline/windows.rb
+++ b/lib/reline/windows.rb
@@ -9,6 +9,10 @@ class Reline::Windows
true
end
+ def self.win_legacy_console?
+ @@legacy_console
+ end
+
RAW_KEYSTROKE_CONFIG = {
[224, 72] => :ed_prev_history, # ↑
[224, 80] => :ed_next_history, # ↓
@@ -94,6 +98,26 @@ class Reline::Windows
@@GetFileInformationByHandleEx = Win32API.new('kernel32', 'GetFileInformationByHandleEx', ['L', 'I', 'P', 'L'], 'I')
@@FillConsoleOutputAttribute = Win32API.new('kernel32', 'FillConsoleOutputAttribute', ['L', 'L', 'L', 'L', 'P'], 'L')
+ @@GetConsoleMode = Win32API.new('kernel32', 'GetConsoleMode', ['L', 'P'], 'L')
+ @@SetConsoleMode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'L')
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4
+
+ private_class_method def self.getconsolemode
+ mode = "\000\000\000\000"
+ @@GetConsoleMode.call(@@hConsoleHandle, mode)
+ mode.unpack1('L')
+ end
+
+ private_class_method def self.setconsolemode(mode)
+ @@SetConsoleMode.call(@@hConsoleHandle, mode)
+ end
+
+ @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0)
+ #if @@legacy_console
+ # setconsolemode(getconsolemode() | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
+ # @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0)
+ #end
+
@@input_buf = []
@@output_buf = []
diff --git a/test/irb/test_cmd.rb b/test/irb/test_cmd.rb
index 7219473e4c..41f84f1922 100644
--- a/test/irb/test_cmd.rb
+++ b/test/irb/test_cmd.rb
@@ -48,7 +48,8 @@ module TestIRB
Ruby\sversion: .+\n
IRB\sversion:\sirb .+\n
InputMethod:\sReidlineInputMethod\swith\sReline .+ and .+\n
- \.irbrc\spath: .+
+ \.irbrc\spath: .+\n
+ RUBY_PLATFORM: .+
}x
assert_match expected, irb.context.main.irb_info.to_s
end
@@ -67,7 +68,8 @@ module TestIRB
Ruby\sversion: .+\n
IRB\sversion:\sirb .+\n
InputMethod:\sReadlineInputMethod\swith .+ and .+\n
- \.irbrc\spath: .+
+ \.irbrc\spath: .+\n
+ RUBY_PLATFORM: .+
}x
assert_match expected, irb.context.main.irb_info.to_s
end
@@ -89,6 +91,7 @@ module TestIRB
Ruby\sversion: .+\n
IRB\sversion:\sirb .+\n
InputMethod:\sReidlineInputMethod\swith\sReline\s[^ ]+(?!\sand\s.+)\n
+ RUBY_PLATFORM: .+\n
\z
}x
assert_match expected, irb.context.main.irb_info.to_s
@@ -115,6 +118,7 @@ module TestIRB
Ruby\sversion: .+\n
IRB\sversion:\sirb .+\n
InputMethod:\sReadlineInputMethod\swith\s(?~.*\sand\s.+)\n
+ RUBY_PLATFORM: .+\n
\z
}x
assert_match expected, irb.context.main.irb_info.to_s
diff --git a/test/irb/test_workspace.rb b/test/irb/test_workspace.rb
index 15c77315a8..f028fc3aa2 100644
--- a/test/irb/test_workspace.rb
+++ b/test/irb/test_workspace.rb
@@ -9,6 +9,7 @@ require 'irb/color'
module TestIRB
class TestWorkSpace < Test::Unit::TestCase
def test_code_around_binding
+ IRB.conf[:USE_COLORIZE] = false
Tempfile.create('irb') do |f|
code = <<~RUBY
# 1
@@ -33,6 +34,8 @@ module TestIRB
EOS
end
+ ensure
+ IRB.conf.delete(:USE_COLORIZE)
end
def test_code_around_binding_with_existing_unreadable_file
@@ -52,6 +55,7 @@ module TestIRB
end
def test_code_around_binding_with_script_lines__
+ IRB.conf[:USE_COLORIZE] = false
with_script_lines do |script_lines|
Tempfile.create('irb') do |f|
code = "IRB::WorkSpace.new(binding)\n"
@@ -67,6 +71,8 @@ module TestIRB
EOS
end
end
+ ensure
+ IRB.conf.delete(:USE_COLORIZE)
end
def test_code_around_binding_on_irb
diff --git a/test/reline/test_key_actor_emacs.rb b/test/reline/test_key_actor_emacs.rb
index b4dc3a1bcb..947685409f 100644
--- a/test/reline/test_key_actor_emacs.rb
+++ b/test/reline/test_key_actor_emacs.rb
@@ -2280,6 +2280,14 @@ class Reline::KeyActor::Emacs::Test < Reline::TestCase
assert_line(' 12345')
end
+ def test_input_unknown_char
+ input_keys('͸') # U+0378 (unassigned)
+ assert_line('͸')
+ assert_byte_pointer_size('͸')
+ assert_cursor(1)
+ assert_cursor_max(1)
+ end
+
=begin # TODO: move KeyStroke instance from Reline to LineEditor
def test_key_delete
input_keys('ab')
diff --git a/test/reline/yamatanooroti/multiline_repl b/test/reline/yamatanooroti/multiline_repl
new file mode 100755
index 0000000000..f2efdd4eaf
--- /dev/null
+++ b/test/reline/yamatanooroti/multiline_repl
@@ -0,0 +1,74 @@
+#!/usr/bin/env ruby
+
+require 'reline'
+require 'optparse'
+require_relative 'termination_checker'
+
+opt = OptionParser.new
+opt.on('--prompt-list-cache-timeout VAL') { |v|
+ Reline::LineEditor.__send__(:remove_const, :PROMPT_LIST_CACHE_TIMEOUT)
+ Reline::LineEditor::PROMPT_LIST_CACHE_TIMEOUT = v.to_f
+}
+opt.on('--dynamic-prompt') {
+ Reline.prompt_proc = proc { |lines|
+ lines.each_with_index.map { |l, i|
+ '[%04d]> ' % i
+ }
+ }
+}
+opt.on('--broken-dynamic-prompt') {
+ Reline.prompt_proc = proc { |lines|
+ range = lines.size > 1 ? (0..(lines.size - 2)) : (0..0)
+ lines[range].each_with_index.map { |l, i|
+ '[%04d]> ' % i
+ }
+ }
+}
+opt.on('--dynamic-prompt-returns-empty') {
+ Reline.prompt_proc = proc { |l| [] }
+}
+opt.on('--auto-indent') {
+ AutoIndent.new
+}
+opt.parse!(ARGV)
+
+begin
+ stty_save = `stty -g`.chomp
+rescue
+end
+
+begin
+ prompt = ENV['RELINE_TEST_PROMPT'] || 'prompt> '
+ puts 'Multiline REPL.'
+ checker = TerminationChecker.new
+ while code = Reline.readmultiline(prompt, true) { |code| checker.terminated?(code) }
+ case code.chomp
+ when 'exit', 'quit', 'q'
+ exit 0
+ when ''
+ # NOOP
+ else
+ begin
+ result = eval(code)
+ puts "=> #{result.inspect}"
+ rescue ScriptError, StandardError => e
+ puts "Traceback (most recent call last):"
+ e.backtrace.reverse_each do |f|
+ puts " #{f}"
+ end
+ puts e.message
+ end
+ end
+ end
+rescue Interrupt
+ puts '^C'
+ `stty #{stty_save}` if stty_save
+ exit 0
+ensure
+ `stty #{stty_save}` if stty_save
+end
+begin
+ puts
+rescue Errno::EIO
+ # Maybe the I/O has been closed.
+end
diff --git a/test/reline/yamatanooroti/termination_checker.rb b/test/reline/yamatanooroti/termination_checker.rb
new file mode 100644
index 0000000000..a36e075bde
--- /dev/null
+++ b/test/reline/yamatanooroti/termination_checker.rb
@@ -0,0 +1,30 @@
+require 'ripper'
+require 'irb/ruby-lex'
+
+class TerminationChecker < RubyLex
+ def terminated?(code)
+ code.gsub!(/\n*$/, '').concat("\n")
+ @tokens = Ripper.lex(code)
+ continue = process_continue
+ code_block_open = check_code_block(code)
+ indent = process_nesting_level
+ ltype = process_literal_type
+ if code_block_open or ltype or continue or indent > 0
+ false
+ else
+ true
+ end
+ end
+end
+
+class AutoIndent < RubyLex
+ def initialize
+ set_input(self)
+ context = Struct.new(:auto_indent_mode).new(true)
+ set_auto_indent(context)
+ end
+
+ def auto_indent(&block)
+ Reline.auto_indent_proc = block
+ end
+end
diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb
index 0ccc331efd..6f9a14de67 100644
--- a/test/reline/yamatanooroti/test_rendering.rb
+++ b/test/reline/yamatanooroti/test_rendering.rb
@@ -26,7 +26,7 @@ begin
end
def test_history_back
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(":a\n")
write("\C-p")
close
@@ -39,7 +39,7 @@ begin
end
def test_backspace
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(":abc\C-h\n")
close
assert_screen(<<~EOC)
@@ -51,7 +51,7 @@ begin
end
def test_autowrap
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write('01234567890123456789012')
close
assert_screen(<<~EOC)
@@ -62,7 +62,7 @@ begin
end
def test_fullwidth
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(":あ\n")
close
assert_screen(<<~EOC)
@@ -74,7 +74,7 @@ begin
end
def test_two_fullwidth
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(":あい\n")
close
assert_screen(<<~EOC)
@@ -86,7 +86,7 @@ begin
end
def test_finish_autowrapped_line
- start_terminal(10, 40, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(10, 40, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("[{'user'=>{'email'=>'a@a', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]\n")
close
assert_screen(<<~EOC)
@@ -102,7 +102,7 @@ begin
end
def test_finish_autowrapped_line_in_the_middle_of_lines
- start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(20, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("[{'user'=>{'email'=>'abcdef@abcdef', 'id'=>'ABC'}, 'version'=>4, 'status'=>'succeeded'}]#{"\C-b"*7}")
write("\n")
close
@@ -121,7 +121,7 @@ begin
end
def test_finish_autowrapped_line_in_the_middle_of_multilines
- start_terminal(30, 16, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(30, 16, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("<<~EOM\n ABCDEFG\nEOM\n")
close
assert_screen(<<~'EOC')
@@ -139,7 +139,7 @@ begin
write_inputrc <<~'LINES'
"abc": "123"
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("abc\n")
close
assert_screen(<<~EOC)
@@ -154,7 +154,7 @@ begin
write_inputrc <<~LINES
set show-mode-in-prompt on
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
close
assert_screen(<<~EOC)
Multiline REPL.
@@ -167,7 +167,7 @@ begin
set editing-mode vi
set show-mode-in-prompt on
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(":a\n\C-[k")
close
assert_screen(<<~EOC)
@@ -183,7 +183,7 @@ begin
set show-mode-in-prompt on
set emacs-mode-string [emacs]
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
close
assert_screen(<<~EOC)
Multiline REPL.
@@ -196,7 +196,7 @@ begin
set show-mode-in-prompt on
set emacs-mode-string "[emacs]"
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
close
assert_screen(<<~EOC)
Multiline REPL.
@@ -211,7 +211,7 @@ begin
set vi-ins-mode-string "{InS}"
set vi-cmd-mode-string "{CmD}"
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(":a\n\C-[k")
close
assert_screen(<<~EOC)
@@ -227,7 +227,7 @@ begin
set editing-mode vi
set show-mode-in-prompt on
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(":a\C-[ab\C-[ac\C-h\C-h\C-h\C-h:a")
close
assert_screen(<<~EOC)
@@ -238,7 +238,7 @@ begin
def test_prompt_with_escape_sequence
ENV['RELINE_TEST_PROMPT'] = "\1\e[30m\2prompt> \1\e[m\2"
- start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("123\n")
close
assert_screen(<<~EOC)
@@ -251,7 +251,7 @@ begin
def test_prompt_with_escape_sequence_and_autowrap
ENV['RELINE_TEST_PROMPT'] = "\1\e[30m\2prompt> \1\e[m\2"
- start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("1234567890123\n")
close
assert_screen(<<~EOC)
@@ -264,7 +264,7 @@ begin
end
def test_multiline_and_autowrap
- start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def aaaaaaaaaa\n 33333333\n end\C-a\C-pputs\C-e\e\C-m888888888888888")
close
assert_screen(<<~EOC)
@@ -281,7 +281,7 @@ begin
end
def test_clear
- start_terminal(10, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(10, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("3\C-l")
close
assert_screen(<<~EOC)
@@ -291,7 +291,7 @@ begin
def test_clear_multiline_and_autowrap
omit # FIXME clear logic is buggy
- start_terminal(10, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(10, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def aaaaaa\n 3\n\C-lend")
close
assert_screen(<<~EOC)
@@ -303,7 +303,7 @@ begin
end
def test_nearest_cursor
- start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def ああ\n :いい\nend\C-pbb\C-pcc")
close
assert_screen(<<~EOC)
@@ -315,7 +315,7 @@ begin
end
def test_delete_line
- start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def a\n\nend\C-p\C-h")
close
assert_screen(<<~EOC)
@@ -326,7 +326,7 @@ begin
end
def test_last_line_of_screen
- start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("\n\n\n\n\ndef a\nend")
close
assert_screen(<<~EOC)
@@ -340,7 +340,7 @@ begin
# c17a09b7454352e2aff5a7d8722e80afb73e454b
def test_autowrap_at_last_line_of_screen
- start_terminal(5, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 15, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def a\nend\n\C-p")
close
assert_screen(<<~EOC)
@@ -354,7 +354,7 @@ begin
# f002483b27cdb325c5edf9e0fe4fa4e1c71c4b0e
def test_insert_line_in_the_middle_of_line
- start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("333\C-b\C-b\e\C-m8")
close
assert_screen(<<~EOC)
@@ -366,7 +366,7 @@ begin
# 9d8978961c5de5064f949d56d7e0286df9e18f43
def test_insert_line_in_the_middle_of_line_at_last_line_of_screen
- start_terminal(3, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(3, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("333333333333333\C-a\C-f\e\C-m")
close
assert_screen(<<~EOC)
@@ -377,7 +377,7 @@ begin
end
def test_insert_after_clear
- start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def a\n 01234\nend\C-l\C-p5678")
close
assert_screen(<<~EOC)
@@ -388,7 +388,7 @@ begin
end
def test_foced_newline_insertion
- start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(10, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
#write("def a\nend\C-p\C-e\e\C-m 3")
write("def a\nend\C-p\C-e\e\x0D")
close
@@ -401,7 +401,7 @@ begin
end
def test_multiline_incremental_search
- start_terminal(6, 25, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(6, 25, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def a\n 8\nend\ndef b\n 3\nend\C-s8")
close
assert_screen(<<~EOC)
@@ -412,7 +412,7 @@ begin
end
def test_multiline_incremental_search_finish
- start_terminal(6, 25, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(6, 25, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def a\n 8\nend\ndef b\n 3\nend\C-r8\C-j")
close
assert_screen(<<~EOC)
@@ -427,7 +427,7 @@ begin
set editing-mode vi
"\\C-j": vi-movement-mode
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(":1234\C-jhhhi0")
close
assert_screen(<<~EOC)
@@ -437,7 +437,7 @@ begin
end
def test_prompt_list_caching
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl --prompt-list-cache-timeout 10 --dynamic-prompt}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --prompt-list-cache-timeout 10 --dynamic-prompt}, startup_message: 'Multiline REPL.')
write("def hoge\n 3\nend")
close
assert_screen(<<~EOC)
@@ -449,7 +449,7 @@ begin
end
def test_broken_prompt_list
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl --broken-dynamic-prompt}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --broken-dynamic-prompt}, startup_message: 'Multiline REPL.')
write("def hoge\n 3\nend")
close
assert_screen(<<~EOC)
@@ -465,7 +465,7 @@ begin
write_inputrc <<~LINES
set enable-bracketed-paste on
LINES
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("\e[200~,")
write("def hoge\n 3\nend")
write("\e[200~.")
@@ -479,7 +479,7 @@ begin
end
def test_backspace_until_returns_to_initial
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("ABC")
write("\C-h\C-h\C-h")
close
@@ -490,7 +490,7 @@ begin
end
def test_longer_than_screen_height
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(<<~EOC.chomp)
def each_top_level_statement
initialize_input
@@ -537,7 +537,7 @@ begin
end
def test_longer_than_screen_height_with_scroll_back
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(<<~EOC.chomp)
def each_top_level_statement
initialize_input
@@ -585,7 +585,7 @@ begin
end
def test_longer_than_screen_height_with_complex_scroll_back
- start_terminal(4, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(4, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write(<<~EOC.chomp)
def each_top_level_statement
initialize_input
@@ -633,7 +633,7 @@ begin
end
def test_update_cursor_correctly_when_just_cursor_moving
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def hoge\n 01234678")
write("\C-p")
write("\C-b")
@@ -650,7 +650,7 @@ begin
end
def test_suppress_auto_indent_just_after_pasted
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
write("def hoge\n [[\n 3]]\ned")
write("\C-bn")
close
@@ -664,7 +664,7 @@ begin
end
def test_suppress_auto_indent_for_adding_newlines_in_pasting
- start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
write("<<~Q\n")
write("{\n #\n}")
write("#")
@@ -679,7 +679,7 @@ begin
end
def test_autowrap_in_the_middle_of_a_line
- start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def abcdefg; end\C-b\C-b\C-b\C-b\C-b")
%w{h i}.each do |c|
write(c)
@@ -693,7 +693,7 @@ begin
end
def test_terminate_in_the_middle_of_lines
- start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
+ start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl}, startup_message: 'Multiline REPL.')
write("def hoge\n 1\n 2\n 3\n 4\nend\n")
write("\C-p\C-p\C-p\C-e\n")
close
@@ -706,6 +706,19 @@ begin
EOC
end
+ def test_dynamic_prompt_returns_empty
+ start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --dynamic-prompt-returns-empty}, startup_message: 'Multiline REPL.')
+ write("def hoge\nend\n")
+ close
+ assert_screen(<<~EOC)
+ Multiline REPL.
+ prompt> def hoge
+ prompt> end
+ => :hoge
+ prompt>
+ EOC
+ end
+
private def write_inputrc(content)
File.open(@inputrc_file, 'w') do |f|
f.write content