1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Refactoring Reline.

This commit is contained in:
manga_osyo 2019-07-15 03:10:26 +09:00 committed by aycabta
parent afed2668a6
commit 298ac04710
4 changed files with 367 additions and 678 deletions

View file

@ -1,5 +1,6 @@
require 'io/console' require 'io/console'
require 'timeout' require 'timeout'
require 'forwardable'
require 'reline/version' require 'reline/version'
require 'reline/config' require 'reline/config'
require 'reline/key_actor' require 'reline/key_actor'
@ -8,252 +9,187 @@ require 'reline/line_editor'
require 'reline/history' require 'reline/history'
module Reline module Reline
Key = Struct.new('Key', :char, :combined_char, :with_meta)
extend self
FILENAME_COMPLETION_PROC = nil FILENAME_COMPLETION_PROC = nil
USERNAME_COMPLETION_PROC = nil USERNAME_COMPLETION_PROC = nil
Key = Struct.new('Key', :char, :combined_char, :with_meta)
CursorPos = Struct.new(:x, :y)
class Core
if RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/ if RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
IS_WINDOWS = true IS_WINDOWS = true
else else
IS_WINDOWS = false IS_WINDOWS = false
end end
CursorPos = Struct.new(:x, :y) ATTR_READER_NAMES = %i(
completion_append_character
basic_word_break_characters
completer_word_break_characters
basic_quote_characters
completer_quote_characters
filename_quote_characters
special_prefixes
completion_proc
output_modifier_proc
prompt_proc
auto_indent_proc
pre_input_hook
dig_perfect_match_proc
).each(&method(:attr_reader)).freeze
@@config = Reline::Config.new ATTR_ACCESSOR_NAMES = %i(
@@key_stroke = Reline::KeyStroke.new(@@config) completion_case_fold
@@line_editor = Reline::LineEditor.new(@@config) ).each(&method(:attr_accessor)).freeze
@@ambiguous_width = nil
HISTORY = History.new(@@config) attr_accessor :config
attr_accessor :key_stroke
attr_accessor :line_editor
attr_accessor :ambiguous_width
attr_reader :output
@@completion_append_character = nil def initialize
def self.completion_append_character self.output = STDOUT
@@completion_append_character yield self
end end
def self.completion_append_character=(val)
def completion_append_character=(val)
if val.nil? if val.nil?
@@completion_append_character = nil @completion_append_character = nil
elsif val.size == 1 elsif val.size == 1
@@completion_append_character = val.encode(Encoding::default_external) @completion_append_character = val.encode(Encoding::default_external)
elsif val.size > 1 elsif val.size > 1
@@completion_append_character = val[0].encode(Encoding::default_external) @completion_append_character = val[0].encode(Encoding::default_external)
else else
@@completion_append_character = nil @completion_append_character = nil
end end
end end
@@basic_word_break_characters = " \t\n`><=;|&{(" def basic_word_break_characters=(v)
def self.basic_word_break_characters @basic_word_break_characters = v.encode(Encoding::default_external)
@@basic_word_break_characters
end
def self.basic_word_break_characters=(v)
@@basic_word_break_characters = v.encode(Encoding::default_external)
end end
@@completer_word_break_characters = @@basic_word_break_characters.dup def completer_word_break_characters=(v)
def self.completer_word_break_characters @completer_word_break_characters = v.encode(Encoding::default_external)
@@completer_word_break_characters
end
def self.completer_word_break_characters=(v)
@@completer_word_break_characters = v.encode(Encoding::default_external)
end end
@@basic_quote_characters = '"\'' def basic_quote_characters=(v)
def self.basic_quote_characters @basic_quote_characters = v.encode(Encoding::default_external)
@@basic_quote_characters
end
def self.basic_quote_characters=(v)
@@basic_quote_characters = v.encode(Encoding::default_external)
end end
@@completer_quote_characters = '"\'' def completer_quote_characters=(v)
def self.completer_quote_characters @completer_quote_characters = v.encode(Encoding::default_external)
@@completer_quote_characters
end
def self.completer_quote_characters=(v)
@@completer_quote_characters = v.encode(Encoding::default_external)
end end
@@filename_quote_characters = '' def filename_quote_characters=(v)
def self.filename_quote_characters @filename_quote_characters = v.encode(Encoding::default_external)
@@filename_quote_characters
end
def self.filename_quote_characters=(v)
@@filename_quote_characters = v.encode(Encoding::default_external)
end end
@@special_prefixes = '' def special_prefixes=(v)
def self.special_prefixes @special_prefixes = v.encode(Encoding::default_external)
@@special_prefixes
end
def self.special_prefixes=(v)
@@special_prefixes = v.encode(Encoding::default_external)
end end
@@completion_case_fold = nil def completion_proc=(p)
def self.completion_case_fold
@@completion_case_fold
end
def self.completion_case_fold=(v)
@@completion_case_fold = v
end
@@completion_proc = nil
def self.completion_proc
@@completion_proc
end
def self.completion_proc=(p)
raise ArgumentError unless p.is_a?(Proc) raise ArgumentError unless p.is_a?(Proc)
@@completion_proc = p @completion_proc = p
end end
@@output_modifier_proc = nil def output_modifier_proc=(p)
def self.output_modifier_proc
@@output_modifier_proc
end
def self.output_modifier_proc=(p)
raise ArgumentError unless p.is_a?(Proc) raise ArgumentError unless p.is_a?(Proc)
@@output_modifier_proc = p @output_modifier_proc = p
end end
@@prompt_proc = nil def prompt_proc=(p)
def self.prompt_proc
@@prompt_proc
end
def self.prompt_proc=(p)
raise ArgumentError unless p.is_a?(Proc) raise ArgumentError unless p.is_a?(Proc)
@@prompt_proc = p @prompt_proc = p
end end
@@auto_indent_proc = nil def auto_indent_proc=(p)
def self.auto_indent_proc
@@auto_indent_proc
end
def self.auto_indent_proc=(p)
raise ArgumentError unless p.is_a?(Proc) raise ArgumentError unless p.is_a?(Proc)
@@auto_indent_proc = p @auto_indent_proc = p
end end
@@pre_input_hook = nil def pre_input_hook=(p)
def self.pre_input_hook @pre_input_hook = p
@@pre_input_hook
end
def self.pre_input_hook=(p)
@@pre_input_hook = p
end end
@@dig_perfect_match_proc = nil def dig_perfect_match_proc=(p)
def self.dig_perfect_match_proc
@@dig_perfect_match_proc
end
def self.dig_perfect_match_proc=(p)
raise ArgumentError unless p.is_a?(Proc) raise ArgumentError unless p.is_a?(Proc)
@@dig_perfect_match_proc = p @dig_perfect_match_proc = p
end end
def self.insert_text(text) def input=(val)
@@line_editor&.insert_text(text)
self
end
def self.redisplay
@@line_editor&.rerender
end
def self.line_buffer
@@line_editor&.line
end
def self.point
@@line_editor ? @@line_editor.byte_pointer : 0
end
def self.point=(val)
@@line_editor.byte_pointer = val
end
def self.delete_text(start = nil, length = nil)
@@line_editor&.delete_text(start, length)
end
def self.input=(val)
raise TypeError unless val.respond_to?(:getc) or val.nil? raise TypeError unless val.respond_to?(:getc) or val.nil?
if val.respond_to?(:getc) if val.respond_to?(:getc)
if defined?(Reline::ANSI) and IOGate == Reline::ANSI if defined?(Reline::ANSI) and Reline::IOGate == Reline::ANSI
Reline::ANSI.input = val Reline::ANSI.input = val
elsif IOGate == Reline::GeneralIO elsif Reline::IOGate == Reline::GeneralIO
Reline::GeneralIO.input = val Reline::GeneralIO.input = val
end end
end end
end end
@@output = STDOUT def output=(val)
def self.output=(val)
raise TypeError unless val.respond_to?(:write) or val.nil? raise TypeError unless val.respond_to?(:write) or val.nil?
@@output = val @output = val
if defined?(Reline::ANSI) and IOGate == Reline::ANSI if defined?(Reline::ANSI) and Reline::IOGate == Reline::ANSI
Reline::ANSI.output = val Reline::ANSI.output = val
end end
end end
def self.vi_editing_mode def vi_editing_mode
@@config.editing_mode = :vi_insert config.editing_mode = :vi_insert
nil nil
end end
def self.emacs_editing_mode def emacs_editing_mode
@@config.editing_mode = :emacs config.editing_mode = :emacs
nil nil
end end
def self.vi_editing_mode? def vi_editing_mode?
@@config.editing_mode_is?(:vi_insert, :vi_command) config.editing_mode_is?(:vi_insert, :vi_command)
end end
def self.emacs_editing_mode? def emacs_editing_mode?
@@config.editing_mode_is?(:emacs) config.editing_mode_is?(:emacs)
end end
def self.get_screen_size def get_screen_size
Reline::IOGate.get_screen_size Reline::IOGate.get_screen_size
end end
def eof?
@@line_editor.eof?
end
def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination) def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination)
unless confirm_multiline_termination unless confirm_multiline_termination
raise ArgumentError.new('#readmultiline needs block to confirm multiline termination') raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
end end
inner_readline(prompt, add_hist, true, &confirm_multiline_termination) inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
whole_buffer = @@line_editor.whole_buffer.dup whole_buffer = line_editor.whole_buffer.dup
whole_buffer.taint whole_buffer.taint
if add_hist and whole_buffer and whole_buffer.chomp.size > 0 if add_hist and whole_buffer and whole_buffer.chomp.size > 0
Reline::HISTORY << whole_buffer Reline::HISTORY << whole_buffer
end end
@@line_editor.reset_line if @@line_editor.whole_buffer.nil? line_editor.reset_line if line_editor.whole_buffer.nil?
whole_buffer whole_buffer
end end
def readline(prompt = '', add_hist = false) def readline(prompt = '', add_hist = false)
inner_readline(prompt, add_hist, false) inner_readline(prompt, add_hist, false)
line = @@line_editor.line.dup line = line_editor.line.dup
line.taint line.taint
if add_hist and line and line.chomp.size > 0 if add_hist and line and line.chomp.size > 0
Reline::HISTORY << line.chomp Reline::HISTORY << line.chomp
end end
@@line_editor.reset_line if @@line_editor.line.nil? line_editor.reset_line if line_editor.line.nil?
line line
end end
private
def inner_readline(prompt, add_hist, multiline, &confirm_multiline_termination) def inner_readline(prompt, add_hist, multiline, &confirm_multiline_termination)
if ENV['RELINE_STDERR_TTY'] if ENV['RELINE_STDERR_TTY']
$stderr.reopen(ENV['RELINE_STDERR_TTY'], 'w') $stderr.reopen(ENV['RELINE_STDERR_TTY'], 'w')
@ -263,50 +199,50 @@ module Reline
otio = Reline::IOGate.prep otio = Reline::IOGate.prep
may_req_ambiguous_char_width may_req_ambiguous_char_width
@@line_editor.reset(prompt) line_editor.reset(prompt)
if multiline if multiline
@@line_editor.multiline_on line_editor.multiline_on
if block_given? if block_given?
@@line_editor.confirm_multiline_termination_proc = confirm_multiline_termination line_editor.confirm_multiline_termination_proc = confirm_multiline_termination
end end
else else
@@line_editor.multiline_off line_editor.multiline_off
end end
@@line_editor.output = @@output line_editor.output = output
@@line_editor.completion_proc = @@completion_proc line_editor.completion_proc = completion_proc
@@line_editor.output_modifier_proc = @@output_modifier_proc line_editor.output_modifier_proc = output_modifier_proc
@@line_editor.prompt_proc = @@prompt_proc line_editor.prompt_proc = prompt_proc
@@line_editor.auto_indent_proc = @@auto_indent_proc line_editor.auto_indent_proc = auto_indent_proc
@@line_editor.dig_perfect_match_proc = @@dig_perfect_match_proc line_editor.dig_perfect_match_proc = dig_perfect_match_proc
@@line_editor.pre_input_hook = @@pre_input_hook line_editor.pre_input_hook = pre_input_hook
@@line_editor.rerender line_editor.rerender
unless @@config.test_mode unless config.test_mode
@@config.read config.read
@@config.reset_default_key_bindings config.reset_default_key_bindings
Reline::IOGate::RAW_KEYSTROKE_CONFIG.each_pair do |key, func| Reline::IOGate::RAW_KEYSTROKE_CONFIG.each_pair do |key, func|
@@config.add_default_key_binding(key, func) config.add_default_key_binding(key, func)
end end
end end
begin begin
loop do loop do
read_io(@@config.keyseq_timeout) { |inputs| read_io(config.keyseq_timeout) { |inputs|
inputs.each { |c| inputs.each { |c|
@@line_editor.input_key(c) line_editor.input_key(c)
@@line_editor.rerender line_editor.rerender
} }
} }
break if @@line_editor.finished? break if line_editor.finished?
end end
Reline::IOGate.move_cursor_column(0) Reline::IOGate.move_cursor_column(0)
rescue StandardError => e rescue StandardError => e
@@line_editor.finalize line_editor.finalize
Reline::IOGate.deprep(otio) Reline::IOGate.deprep(otio)
raise e raise e
end end
@@line_editor.finalize line_editor.finalize
Reline::IOGate.deprep(otio) Reline::IOGate.deprep(otio)
end end
@ -323,10 +259,10 @@ module Reline
loop do loop do
c = Reline::IOGate.getc c = Reline::IOGate.getc
buffer << c buffer << c
result = @@key_stroke.match_status(buffer) result = key_stroke.match_status(buffer)
case result case result
when :matched when :matched
block.(@@key_stroke.expand(buffer).map{ |c| Reline::Key.new(c, c, false) }) block.(key_stroke.expand(buffer).map{ |c| Reline::Key.new(c, c, false) })
break break
when :matching when :matching
if buffer.size == 1 if buffer.size == 1
@ -339,7 +275,7 @@ module Reline
block.([Reline::Key.new(c, c, false)]) block.([Reline::Key.new(c, c, false)])
break break
else else
if @@key_stroke.match_status(buffer.dup.push(succ_c)) == :unmatched if key_stroke.match_status(buffer.dup.push(succ_c)) == :unmatched
if c == "\e".ord if c == "\e".ord
block.([Reline::Key.new(succ_c, succ_c | 0b10000000, true)]) block.([Reline::Key.new(succ_c, succ_c | 0b10000000, true)])
else else
@ -384,23 +320,80 @@ module Reline
end end
def may_req_ambiguous_char_width def may_req_ambiguous_char_width
@@ambiguous_width = 2 if Reline::IOGate == Reline::GeneralIO or STDOUT.is_a?(File) ambiguous_width = 2 if Reline::IOGate == Reline::GeneralIO or STDOUT.is_a?(File)
return if @@ambiguous_width return if ambiguous_width
Reline::IOGate.move_cursor_column(0) Reline::IOGate.move_cursor_column(0)
print "\u{25bd}" print "\u{25bd}"
@@ambiguous_width = Reline::IOGate.cursor_pos.x ambiguous_width = Reline::IOGate.cursor_pos.x
Reline::IOGate.move_cursor_column(0) Reline::IOGate.move_cursor_column(0)
Reline::IOGate.erase_after_cursor Reline::IOGate.erase_after_cursor
end end
def self.ambiguous_width
@@ambiguous_width
end
end end
if Reline::IS_WINDOWS extend SingleForwardable
#--------------------------------------------------------
# Documented API
#--------------------------------------------------------
(Core::ATTR_READER_NAMES + Core::ATTR_ACCESSOR_NAMES).each { |name|
def_delegators :core, "#{name}", "#{name}="
}
def_delegators :core, :input=, :output=
def_delegators :core, :vi_editing_mode, :emacs_editing_mode
def_delegators :core, :readline
#--------------------------------------------------------
# Undocumented API
#--------------------------------------------------------
# Testable in original
def_delegators :core, :get_screen_size
def_delegators :line_editor, :delete_text
def_delegator :line_editor, :line, :line_buffer
def_delegator :line_editor, :byte_pointer, :point
def_delegator :line_editor, :byte_pointer=, :point=
def self.insert_text(*args, &block)
line_editor.insert_text(*args, &block)
self
end
# Untestable in original
def_delegator :line_editor, :rerender, :redisplay
def_delegators :core, :vi_editing_mode?, :emacs_editing_mode?
def_delegators :core, :ambiguous_width
def_delegators :core, :readmultiline
private
def self.core
@core ||= Core.new { |core|
core.config = Reline::Config.new
core.key_stroke = Reline::KeyStroke.new(core.config)
core.line_editor = Reline::LineEditor.new(core.config)
core.basic_word_break_characters = " \t\n`><=;|&{("
core.completer_word_break_characters = " \t\n`><=;|&{("
core.basic_quote_characters = '"\''
core.completer_quote_characters = '"\''
core.filename_quote_characters = ""
core.special_prefixes = ""
}
end
def self.line_editor
core.line_editor
end
HISTORY = History.new(core.config)
end
if Reline::Core::IS_WINDOWS
require 'reline/windows' require 'reline/windows'
Reline::IOGate = Reline::Windows Reline::IOGate = Reline::Core::Windows
else else
require 'reline/ansi' require 'reline/ansi'
Reline::IOGate = Reline::ANSI Reline::IOGate = Reline::ANSI

View file

@ -1,133 +0,0 @@
require 'io/console'
require 'timeout'
require "forwardable"
require 'reline/version'
require 'reline/config'
require 'reline/key_actor'
require 'reline/key_stroke'
require 'reline/line_editor'
module Reline2
FILENAME_COMPLETION_PROC = nil
USERNAME_COMPLETION_PROC = nil
class Core
Key = Struct.new('Key', :char, :combined_char, :with_meta)
if RUBY_PLATFORM =~ /mswin|mingw/
IS_WINDOWS = true
else
IS_WINDOWS = false
end
CursorPos = Struct.new(:x, :y)
ATTR_ACCESSOR_NAMES = %i(
completion_append_character
basic_word_break_characters
completer_word_break_characters
basic_quote_characters
completer_quote_characters
filename_quote_characters
special_prefixes
completion_case_fold
completion_proc
output_modifier_proc
prompt_proc
auto_indent_proc
pre_input_hook
dig_perfect_match_proc
).freeze
ATTR_ACCESSOR_NAMES.each &method(:attr_accessor)
def initialize
@config = Reline::Config.new
@line_editor = Reline::LineEditor.new(@config)
@ambiguous_width = nil
self.basic_word_break_characters = " \t\n`><=;|&{("
self.completer_word_break_characters = " \t\n`><=;|&{("
self.basic_quote_characters = '"\''
self.completer_quote_characters = '"\''
self.filename_quote_characters = ""
self.special_prefixes = ""
end
def completion_append_character=(val)
if val.nil?
@completion_append_character = nil
elsif val.size == 1
@completion_append_character = val.encode(Encoding::default_external)
elsif val.size > 1
@completion_append_character = val[0].encode(Encoding::default_external)
else
@completion_append_character = nil
end
end
def basic_word_break_characters=(v)
@basic_word_break_characters = v.encode(Encoding::default_external)
end
def completer_word_break_characters=(v)
@completer_word_break_characters = v.encode(Encoding::default_external)
end
def basic_quote_characters=(v)
@basic_quote_characters = v.encode(Encoding::default_external)
end
def completer_quote_characters=(v)
@completer_quote_characters = v.encode(Encoding::default_external)
end
def filename_quote_characters=(v)
@filename_quote_characters = v.encode(Encoding::default_external)
end
def special_prefixes=(v)
@special_prefixes = v.encode(Encoding::default_external)
end
def completion_proc=(p)
raise ArgumentError unless p.is_a?(Proc)
@completion_proc = p
end
def output_modifier_proc=(p)
raise ArgumentError unless p.is_a?(Proc)
@output_modifier_proc = p
end
def prompt_proc=(p)
raise ArgumentError unless p.is_a?(Proc)
@prompt_proc = p
end
def auto_indent_proc=(p)
raise ArgumentError unless p.is_a?(Proc)
@auto_indent_proc = p
end
def pre_input_hook=(p)
raise ArgumentError unless p.is_a?(Proc)
@pre_input_hook = p
end
def dig_perfect_match_proc=(p)
raise ArgumentError unless p.is_a?(Proc)
@dig_perfect_match_proc = p
end
end
extend SingleForwardable
Core::ATTR_ACCESSOR_NAMES.each { |name|
def_delegators :core, "#{name}", "#{name}="
}
private
def self.core
@core ||= Core.new
end
end

View file

@ -1,6 +1,5 @@
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__) $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'reline' require 'reline'
require 'reline2'
require 'test/unit' require 'test/unit'
module Reline module Reline
@ -8,8 +7,12 @@ module Reline
def test_mode def test_mode
remove_const('IOGate') if const_defined?('IOGate') remove_const('IOGate') if const_defined?('IOGate')
const_set('IOGate', Reline::GeneralIO) const_set('IOGate', Reline::GeneralIO)
@@config.instance_variable_set(:@test_mode, true) send(:core).config.instance_variable_set(:@test_mode, true)
@@config.reset send(:core).config.reset
end
def test_reset
Reline.instance_variable_set(:@core, nil)
end end
end end
end end

View file

@ -1,174 +0,0 @@
require_relative 'helper'
require "reline2"
class Reline2::Test < Reline::TestCase
def test_completion_append_character
assert_equal(Reline2.completion_append_character, nil)
Reline2.completion_append_character = ""
assert_equal(Reline2.completion_append_character, nil)
Reline2.completion_append_character = "a"
assert_equal(Reline2.completion_append_character, "a")
assert_equal(Reline2.completion_append_character.encoding, Encoding::default_external)
Reline2.completion_append_character = "ba"
assert_equal(Reline2.completion_append_character, "b")
assert_equal(Reline2.completion_append_character.encoding, Encoding::default_external)
Reline2.completion_append_character = "cba"
assert_equal(Reline2.completion_append_character, "c")
assert_equal(Reline2.completion_append_character.encoding, Encoding::default_external)
Reline2.completion_append_character = nil
assert_equal(Reline2.completion_append_character, nil)
end
def test_basic_word_break_characters
assert_equal(Reline2.basic_word_break_characters, " \t\n`><=;|&{(")
Reline2.basic_word_break_characters = "ああ"
assert_equal(Reline2.basic_word_break_characters, "ああ")
assert_equal(Reline2.basic_word_break_characters.encoding, Encoding::default_external)
end
def test_completer_word_break_characters
assert_equal(Reline2.completer_word_break_characters, " \t\n`><=;|&{(")
Reline2.completer_word_break_characters = "ああ"
assert_equal(Reline2.completer_word_break_characters, "ああ")
assert_equal(Reline2.completer_word_break_characters.encoding, Encoding::default_external)
end
def test_basic_quote_characters
assert_equal(Reline2.basic_quote_characters, '"\'')
Reline2.basic_quote_characters = ""
assert_equal(Reline2.basic_quote_characters, "")
assert_equal(Reline2.basic_quote_characters.encoding, Encoding::default_external)
end
def test_completer_quote_characters
assert_equal(Reline2.completer_quote_characters, '"\'')
Reline2.completer_quote_characters = ""
assert_equal(Reline2.completer_quote_characters, "")
assert_equal(Reline2.completer_quote_characters.encoding, Encoding::default_external)
end
def test_filename_quote_characters
assert_equal(Reline2.filename_quote_characters, '')
Reline2.filename_quote_characters = "\'"
assert_equal(Reline2.filename_quote_characters, "\'")
assert_equal(Reline2.filename_quote_characters.encoding, Encoding::default_external)
end
def test_special_prefixes
assert_equal(Reline2.special_prefixes, '')
Reline2.special_prefixes = "\'"
assert_equal(Reline2.special_prefixes, "\'")
assert_equal(Reline2.special_prefixes.encoding, Encoding::default_external)
end
def test_completion_case_fold
assert_equal(Reline2.completion_case_fold, nil)
Reline2.completion_case_fold = true
assert_equal(Reline2.completion_case_fold, true)
Reline2.completion_case_fold = "hoge"
assert_equal(Reline2.completion_case_fold, "hoge")
end
def test_completion_proc
assert_equal(Reline2.completion_proc, nil)
p = proc {}
Reline2.completion_proc = p
assert_equal(Reline2.completion_proc, p)
l = lambda {}
Reline2.completion_proc = l
assert_equal(Reline2.completion_proc, l)
assert_raise(ArgumentError) { Reline2.completion_proc = 42 }
assert_raise(ArgumentError) { Reline2.completion_proc = "hoge" }
end
def test_output_modifier_proc
assert_equal(Reline2.output_modifier_proc, nil)
p = proc {}
Reline2.output_modifier_proc = p
assert_equal(Reline2.output_modifier_proc, p)
l = lambda {}
Reline2.output_modifier_proc = l
assert_equal(Reline2.output_modifier_proc, l)
assert_raise(ArgumentError) { Reline2.output_modifier_proc = 42 }
assert_raise(ArgumentError) { Reline2.output_modifier_proc = "hoge" }
end
def test_prompt_proc
assert_equal(Reline2.prompt_proc, nil)
p = proc {}
Reline2.prompt_proc = p
assert_equal(Reline2.prompt_proc, p)
l = lambda {}
Reline2.prompt_proc = l
assert_equal(Reline2.prompt_proc, l)
assert_raise(ArgumentError) { Reline2.prompt_proc = 42 }
assert_raise(ArgumentError) { Reline2.prompt_proc = "hoge" }
end
def test_auto_indent_proc
assert_equal(Reline2.auto_indent_proc, nil)
p = proc {}
Reline2.auto_indent_proc = p
assert_equal(Reline2.auto_indent_proc, p)
l = lambda {}
Reline2.auto_indent_proc = l
assert_equal(Reline2.auto_indent_proc, l)
assert_raise(ArgumentError) { Reline2.auto_indent_proc = 42 }
assert_raise(ArgumentError) { Reline2.auto_indent_proc = "hoge" }
end
def test_pre_input_hook
assert_equal(Reline2.pre_input_hook, nil)
p = proc {}
Reline2.pre_input_hook = p
assert_equal(Reline2.pre_input_hook, p)
l = lambda {}
Reline2.pre_input_hook = l
assert_equal(Reline2.pre_input_hook, l)
assert_raise(ArgumentError) { Reline2.pre_input_hook = 42 }
assert_raise(ArgumentError) { Reline2.pre_input_hook = "hoge" }
end
def test_dig_perfect_match_proc
assert_equal(Reline2.dig_perfect_match_proc, nil)
p = proc {}
Reline2.dig_perfect_match_proc = p
assert_equal(Reline2.dig_perfect_match_proc, p)
l = lambda {}
Reline2.dig_perfect_match_proc = l
assert_equal(Reline2.dig_perfect_match_proc, l)
assert_raise(ArgumentError) { Reline2.dig_perfect_match_proc = 42 }
assert_raise(ArgumentError) { Reline2.dig_perfect_match_proc = "hoge" }
end
end