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

Test ext/readline and lib/reline by test/readline

This commit is contained in:
aycabta 2019-05-14 07:00:03 +09:00
parent 07e7ae9ed7
commit c754e979d3
3 changed files with 224 additions and 197 deletions

16
test/readline/helper.rb Normal file
View file

@ -0,0 +1,16 @@
begin
require "readline.so"
ReadlineSo = Readline
rescue LoadError
end
require "reline"
def use_ext_readline # Use ext/readline as Readline
Object.send(:remove_const, :Readline) if Object.const_defined?(:Readline)
Object.const_set(:Readline, ReadlineSo)
end
def use_lib_reline # Use lib/reline as Readline
Object.send(:remove_const, :Readline) if Object.const_defined?(:Readline)
Object.const_set(:Readline, Reline)
end

View file

@ -1,14 +1,10 @@
# frozen_string_literal: false
begin
require "readline"
rescue LoadError
else
require "test/unit"
require "tempfile"
require "timeout"
end
require_relative "helper"
require "test/unit"
require "tempfile"
require "timeout"
class TestReadline < Test::Unit::TestCase
module BasetestReadline
INPUTRC = "INPUTRC"
SAVED_ENV = %w[COLUMNS LINES]
@ -30,90 +26,91 @@ class TestReadline < Test::Unit::TestCase
SAVED_ENV.each_with_index {|k, i| ENV[k] = @saved_env[i] }
end
if !/EditLine/n.match(Readline::VERSION)
def test_readline
with_temp_stdio do |stdin, stdout|
stdin.write("hello\n")
stdin.close
stdout.flush
line = replace_stdio(stdin.path, stdout.path) {
Readline.readline("> ", true)
}
assert_equal("hello", line)
assert_equal(true, line.tainted?)
stdout.rewind
assert_equal("> ", stdout.read(2))
assert_equal(1, Readline::HISTORY.length)
assert_equal("hello", Readline::HISTORY[0])
Thread.start {
$SAFE = 1
assert_raise(SecurityError) do
replace_stdio(stdin.path, stdout.path) do
Readline.readline("> ".taint)
end
def test_readline
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
with_temp_stdio do |stdin, stdout|
stdin.write("hello\n")
stdin.close
stdout.flush
line = replace_stdio(stdin.path, stdout.path) {
Readline.readline("> ", true)
}
assert_equal("hello", line)
assert_equal(true, line.tainted?)
stdout.rewind
assert_equal("> ", stdout.read(2))
assert_equal(1, Readline::HISTORY.length)
assert_equal("hello", Readline::HISTORY[0])
Thread.start {
$SAFE = 1
assert_raise(SecurityError) do
replace_stdio(stdin.path, stdout.path) do
Readline.readline("> ".taint)
end
}.join
ensure
$SAFE = 0
end
end
}.join
ensure
$SAFE = 0
end
end
# line_buffer
# point
def test_line_buffer__point
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
skip "GNU Readline has special behaviors" if defined?(Reline) and Readline == Reline
begin
Readline.line_buffer
Readline.point
rescue NotImplementedError
return
end
# line_buffer
# point
def test_line_buffer__point
begin
Readline.line_buffer
Readline.point
rescue NotImplementedError
return
end
with_temp_stdio do |stdin, stdout|
actual_text = nil
actual_line_buffer = nil
actual_point = nil
Readline.completion_proc = ->(text) {
actual_text = text
actual_point = Readline.point
actual_line_buffer = Readline.line_buffer
stdin.write(" finish\n")
stdin.flush
stdout.flush
return ["complete"]
}
stdin.write("first second\t")
with_temp_stdio do |stdin, stdout|
actual_text = nil
actual_line_buffer = nil
actual_point = nil
Readline.completion_proc = ->(text) {
actual_text = text
actual_point = Readline.point
actual_line_buffer = Readline.line_buffer
stdin.write(" finish\n")
stdin.flush
Readline.completion_append_character = " "
replace_stdio(stdin.path, stdout.path) {
Readline.readline("> ", false)
}
assert_equal("second", actual_text)
assert_equal("first second", actual_line_buffer)
assert_equal(12, actual_point)
assert_equal("first complete finish", Readline.line_buffer)
assert_equal(Encoding.find("locale"), Readline.line_buffer.encoding)
assert_equal(true, Readline.line_buffer.tainted?)
assert_equal(22, Readline.point)
stdout.flush
return ["complete"]
}
stdin.rewind
stdout.rewind
stdin.write("first second\t")
stdin.flush
Readline.completion_append_character = " "
replace_stdio(stdin.path, stdout.path) {
Readline.readline("> ", false)
}
assert_equal("second", actual_text)
assert_equal("first second", actual_line_buffer)
assert_equal(12, actual_point)
assert_equal("first complete finish", Readline.line_buffer)
assert_equal(Encoding.find("locale"), Readline.line_buffer.encoding)
assert_equal(true, Readline.line_buffer.tainted?)
assert_equal(22, Readline.point)
stdin.write("first second\t")
stdin.flush
Readline.completion_append_character = nil
replace_stdio(stdin.path, stdout.path) {
Readline.readline("> ", false)
}
assert_equal("second", actual_text)
assert_equal("first second", actual_line_buffer)
assert_equal(12, actual_point)
assert_equal("first complete finish", Readline.line_buffer)
assert_equal(Encoding.find("locale"), Readline.line_buffer.encoding)
assert_equal(true, Readline.line_buffer.tainted?)
assert_equal(21, Readline.point)
end
end if !defined?(Reline) or Readline != Reline
stdin.rewind
stdout.rewind
stdin.write("first second\t")
stdin.flush
Readline.completion_append_character = nil
replace_stdio(stdin.path, stdout.path) {
Readline.readline("> ", false)
}
assert_equal("second", actual_text)
assert_equal("first second", actual_line_buffer)
assert_equal(12, actual_point)
assert_equal("first complete finish", Readline.line_buffer)
assert_equal(Encoding.find("locale"), Readline.line_buffer.encoding)
assert_equal(true, Readline.line_buffer.tainted?)
assert_equal(21, Readline.point)
end
end
def test_input=
@ -147,6 +144,7 @@ class TestReadline < Test::Unit::TestCase
end
def test_completion_proc_empty_result
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
with_temp_stdio do |stdin, stdout|
stdin.write("first\t")
stdin.flush
@ -165,7 +163,7 @@ class TestReadline < Test::Unit::TestCase
rescue NotimplementedError
end
end
end if !/EditLine/n.match(Readline::VERSION)
end
def test_get_screen_size
begin
@ -225,6 +223,7 @@ class TestReadline < Test::Unit::TestCase
end
def test_completion_encoding
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
bug5941 = '[Bug #5941]'
append_character = Readline.completion_append_character
Readline.completion_append_character = ""
@ -264,9 +263,10 @@ class TestReadline < Test::Unit::TestCase
with_pipe {|r, w| w << "\t"}
end
ensure
return if /EditLine/n.match(Readline::VERSION)
Readline.completion_case_fold = completion_case_fold
Readline.completion_append_character = append_character
end if !/EditLine/n.match(Readline::VERSION)
end
# basic_word_break_characters
# completer_word_break_characters
@ -325,6 +325,7 @@ class TestReadline < Test::Unit::TestCase
end
def test_point
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
assert_equal(0, Readline.point)
Readline.insert_text('12345')
assert_equal(5, Readline.point)
@ -336,9 +337,10 @@ class TestReadline < Test::Unit::TestCase
assert_equal('1234abc5', Readline.line_buffer)
rescue NotImplementedError
end if !/EditLine/n.match(Readline::VERSION)
end
def test_insert_text
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
str = "test_insert_text"
assert_equal(0, Readline.point)
assert_equal(Readline, Readline.insert_text(str))
@ -366,9 +368,10 @@ class TestReadline < Test::Unit::TestCase
Readline.delete_text
assert_equal("", Readline.line_buffer)
rescue NotImplementedError
end if !/EditLine/n.match(Readline::VERSION)
end
def test_delete_text
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
str = "test_insert_text"
assert_equal(0, Readline.point)
assert_equal(Readline, Readline.insert_text(str))
@ -385,9 +388,10 @@ class TestReadline < Test::Unit::TestCase
assert_equal("", Readline.line_buffer)
end
rescue NotImplementedError
end if !/EditLine/n.match(Readline::VERSION)
end
def test_modify_text_in_pre_input_hook
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
with_temp_stdio {|stdin, stdout|
begin
stdin.write("world\n")
@ -413,9 +417,10 @@ class TestReadline < Test::Unit::TestCase
end
end
}
end if !/EditLine|\A4\.3\z/n.match(Readline::VERSION)
end
def test_input_metachar
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
skip("Won't pass on mingw w/readline 7.0.005 [ruby-core:45682]") if mingw?
bug6601 = '[ruby-core:45682]'
Readline::HISTORY << "hello"
@ -427,11 +432,13 @@ class TestReadline < Test::Unit::TestCase
assert_equal("hello", line, bug6601)
ensure
wo&.close
return if /EditLine/n.match(Readline::VERSION)
Readline.delete_text
Readline::HISTORY.clear
end if !/EditLine/n.match(Readline::VERSION)
end
def test_input_metachar_multibyte
skip "Skip Editline" if /EditLine/n.match(Readline::VERSION)
unless Encoding.find("locale") == Encoding::UTF_8
return if assert_under_utf8
skip 'this test needs UTF-8 locale'
@ -455,11 +462,13 @@ class TestReadline < Test::Unit::TestCase
end
end
ensure
return if /EditLine/n.match(Readline::VERSION)
Readline.delete_text
Readline::HISTORY.clear
end if !/EditLine/n.match(Readline::VERSION)
end
def test_refresh_line
skip "Only when refresh_line exists" unless Readline.respond_to?(:refresh_line)
bug6232 = '[ruby-core:43957] [Bug #6232] refresh_line after set_screen_size'
with_temp_stdio do |stdin, stdout|
replace_stdio(stdin.path, stdout.path) do
@ -469,7 +478,7 @@ class TestReadline < Test::Unit::TestCase
end;
end
end
end if Readline.respond_to?(:refresh_line)
end
def test_setting_quoting_detection_proc
return unless Readline.respond_to?(:quoting_detection_proc=)
@ -692,5 +701,22 @@ class TestReadline < Test::Unit::TestCase
SRC
return true
end
end if defined?(::Readline) && !(/mswin|mingw/ =~ RUBY_PLATFORM && defined?(Reline) && Readline == Reline)
# skip on Windows now when using reline because it causes hang of whole tests
end
class TestReadline < Test::Unit::TestCase
include BasetestReadline
def setup
use_ext_readline
super
end
end if defined?(ReadlineSo)
class TestRelineAsReadline < Test::Unit::TestCase
include BasetestReadline
def setup
use_lib_reline
super
end
end

View file

@ -1,61 +1,28 @@
# frozen_string_literal: false
begin
require "readline"
=begin
class << Readline::HISTORY
def []=(index, str)
raise NotImplementedError
end
def pop
raise NotImplementedError
end
def shift
raise NotImplementedError
end
def delete_at(index)
raise NotImplementedError
end
end
=end
=begin
class << Readline::HISTORY
def clear
raise NotImplementedError
end
end
=end
rescue LoadError
else
require "test/unit"
end
class Readline::TestHistory < Test::Unit::TestCase
include Readline
require_relative "helper"
require "test/unit"
module Readline::BasetestHistory
def setup
HISTORY.clear
Readline::HISTORY.clear
end
def test_to_s
expected = "HISTORY"
assert_equal(expected, HISTORY.to_s)
assert_equal(expected, Readline::HISTORY.to_s)
end
def test_get
lines = push_history(5)
lines.each_with_index do |s, i|
assert_external_string_equal(s, HISTORY[i])
assert_external_string_equal(s, Readline::HISTORY[i])
end
end
def test_get__negative
lines = push_history(5)
(1..5).each do |i|
assert_equal(lines[-i], HISTORY[-i])
assert_equal(lines[-i], Readline::HISTORY[-i])
end
end
@ -64,7 +31,7 @@ class Readline::TestHistory < Test::Unit::TestCase
invalid_indexes = [5, 6, 100, -6, -7, -100]
invalid_indexes.each do |i|
assert_raise(IndexError, "i=<#{i}>") do
HISTORY[i]
Readline::HISTORY[i]
end
end
@ -72,7 +39,7 @@ class Readline::TestHistory < Test::Unit::TestCase
-100_000_000_000_000_000_000]
invalid_indexes.each do |i|
assert_raise(RangeError, "i=<#{i}>") do
HISTORY[i]
Readline::HISTORY[i]
end
end
end
@ -82,8 +49,8 @@ class Readline::TestHistory < Test::Unit::TestCase
push_history(5)
5.times do |i|
expected = "set: #{i}"
HISTORY[i] = expected
assert_external_string_equal(expected, HISTORY[i])
Readline::HISTORY[i] = expected
assert_external_string_equal(expected, Readline::HISTORY[i])
end
rescue NotImplementedError
end
@ -91,14 +58,14 @@ class Readline::TestHistory < Test::Unit::TestCase
def test_set__out_of_range
assert_raise(IndexError, NotImplementedError, "index=<0>") do
HISTORY[0] = "set: 0"
Readline::HISTORY[0] = "set: 0"
end
push_history(5)
invalid_indexes = [5, 6, 100, -6, -7, -100]
invalid_indexes.each do |i|
assert_raise(IndexError, NotImplementedError, "index=<#{i}>") do
HISTORY[i] = "set: #{i}"
Readline::HISTORY[i] = "set: #{i}"
end
end
@ -106,7 +73,7 @@ class Readline::TestHistory < Test::Unit::TestCase
-100_000_000_000_000_000_000]
invalid_indexes.each do |i|
assert_raise(RangeError, NotImplementedError, "index=<#{i}>") do
HISTORY[i] = "set: #{i}"
Readline::HISTORY[i] = "set: #{i}"
end
end
end
@ -114,102 +81,102 @@ class Readline::TestHistory < Test::Unit::TestCase
def test_push
5.times do |i|
s = i.to_s
assert_equal(HISTORY, HISTORY.push(s))
assert_external_string_equal(s, HISTORY[i])
assert_equal(Readline::HISTORY, Readline::HISTORY.push(s))
assert_external_string_equal(s, Readline::HISTORY[i])
end
assert_equal(5, HISTORY.length)
assert_equal(5, Readline::HISTORY.length)
end
def test_push__operator
5.times do |i|
s = i.to_s
assert_equal(HISTORY, HISTORY << s)
assert_external_string_equal(s, HISTORY[i])
assert_equal(Readline::HISTORY, Readline::HISTORY << s)
assert_external_string_equal(s, Readline::HISTORY[i])
end
assert_equal(5, HISTORY.length)
assert_equal(5, Readline::HISTORY.length)
end
def test_push__plural
assert_equal(HISTORY, HISTORY.push("0", "1", "2", "3", "4"))
assert_equal(Readline::HISTORY, Readline::HISTORY.push("0", "1", "2", "3", "4"))
(0..4).each do |i|
assert_external_string_equal(i.to_s, HISTORY[i])
assert_external_string_equal(i.to_s, Readline::HISTORY[i])
end
assert_equal(5, HISTORY.length)
assert_equal(5, Readline::HISTORY.length)
assert_equal(HISTORY, HISTORY.push("5", "6", "7", "8", "9"))
assert_equal(Readline::HISTORY, Readline::HISTORY.push("5", "6", "7", "8", "9"))
(5..9).each do |i|
assert_external_string_equal(i.to_s, HISTORY[i])
assert_external_string_equal(i.to_s, Readline::HISTORY[i])
end
assert_equal(10, HISTORY.length)
assert_equal(10, Readline::HISTORY.length)
end
def test_pop
begin
assert_equal(nil, HISTORY.pop)
assert_equal(nil, Readline::HISTORY.pop)
lines = push_history(5)
(1..5).each do |i|
assert_external_string_equal(lines[-i], HISTORY.pop)
assert_equal(lines.length - i, HISTORY.length)
assert_external_string_equal(lines[-i], Readline::HISTORY.pop)
assert_equal(lines.length - i, Readline::HISTORY.length)
end
assert_equal(nil, HISTORY.pop)
assert_equal(nil, Readline::HISTORY.pop)
rescue NotImplementedError
end
end
def test_shift
begin
assert_equal(nil, HISTORY.shift)
assert_equal(nil, Readline::HISTORY.shift)
lines = push_history(5)
(0..4).each do |i|
assert_external_string_equal(lines[i], HISTORY.shift)
assert_equal(lines.length - (i + 1), HISTORY.length)
assert_external_string_equal(lines[i], Readline::HISTORY.shift)
assert_equal(lines.length - (i + 1), Readline::HISTORY.length)
end
assert_equal(nil, HISTORY.shift)
assert_equal(nil, Readline::HISTORY.shift)
rescue NotImplementedError
end
end
def test_each
e = HISTORY.each do |s|
e = Readline::HISTORY.each do |s|
assert(false) # not reachable
end
assert_equal(HISTORY, e)
assert_equal(Readline::HISTORY, e)
lines = push_history(5)
i = 0
e = HISTORY.each do |s|
assert_external_string_equal(HISTORY[i], s)
e = Readline::HISTORY.each do |s|
assert_external_string_equal(Readline::HISTORY[i], s)
assert_external_string_equal(lines[i], s)
i += 1
end
assert_equal(HISTORY, e)
assert_equal(Readline::HISTORY, e)
end
def test_each__enumerator
e = HISTORY.each
e = Readline::HISTORY.each
assert_instance_of(Enumerator, e)
end
def test_length
assert_equal(0, HISTORY.length)
assert_equal(0, Readline::HISTORY.length)
push_history(1)
assert_equal(1, HISTORY.length)
assert_equal(1, Readline::HISTORY.length)
push_history(4)
assert_equal(5, HISTORY.length)
HISTORY.clear
assert_equal(0, HISTORY.length)
assert_equal(5, Readline::HISTORY.length)
Readline::HISTORY.clear
assert_equal(0, Readline::HISTORY.length)
end
def test_empty_p
2.times do
assert(HISTORY.empty?)
HISTORY.push("s")
assert_equal(false, HISTORY.empty?)
HISTORY.clear
assert(HISTORY.empty?)
assert(Readline::HISTORY.empty?)
Readline::HISTORY.push("s")
assert_equal(false, Readline::HISTORY.empty?)
Readline::HISTORY.clear
assert(Readline::HISTORY.empty?)
end
end
@ -217,37 +184,37 @@ class Readline::TestHistory < Test::Unit::TestCase
begin
lines = push_history(5)
(0..4).each do |i|
assert_external_string_equal(lines[i], HISTORY.delete_at(0))
assert_external_string_equal(lines[i], Readline::HISTORY.delete_at(0))
end
assert(HISTORY.empty?)
assert(Readline::HISTORY.empty?)
lines = push_history(5)
(1..5).each do |i|
assert_external_string_equal(lines[lines.length - i], HISTORY.delete_at(-1))
assert_external_string_equal(lines[lines.length - i], Readline::HISTORY.delete_at(-1))
end
assert(HISTORY.empty?)
assert(Readline::HISTORY.empty?)
lines = push_history(5)
assert_external_string_equal(lines[0], HISTORY.delete_at(0))
assert_external_string_equal(lines[4], HISTORY.delete_at(3))
assert_external_string_equal(lines[1], HISTORY.delete_at(0))
assert_external_string_equal(lines[3], HISTORY.delete_at(1))
assert_external_string_equal(lines[2], HISTORY.delete_at(0))
assert(HISTORY.empty?)
assert_external_string_equal(lines[0], Readline::HISTORY.delete_at(0))
assert_external_string_equal(lines[4], Readline::HISTORY.delete_at(3))
assert_external_string_equal(lines[1], Readline::HISTORY.delete_at(0))
assert_external_string_equal(lines[3], Readline::HISTORY.delete_at(1))
assert_external_string_equal(lines[2], Readline::HISTORY.delete_at(0))
assert(Readline::HISTORY.empty?)
rescue NotImplementedError
end
end
def test_delete_at__out_of_range
assert_raise(IndexError, NotImplementedError, "index=<0>") do
HISTORY.delete_at(0)
Readline::HISTORY.delete_at(0)
end
push_history(5)
invalid_indexes = [5, 6, 100, -6, -7, -100]
invalid_indexes.each do |i|
assert_raise(IndexError, NotImplementedError, "index=<#{i}>") do
HISTORY.delete_at(i)
Readline::HISTORY.delete_at(i)
end
end
@ -255,7 +222,7 @@ class Readline::TestHistory < Test::Unit::TestCase
-100_000_000_000_000_000_000]
invalid_indexes.each do |i|
assert_raise(RangeError, NotImplementedError, "index=<#{i}>") do
HISTORY.delete_at(i)
Readline::HISTORY.delete_at(i)
end
end
end
@ -271,7 +238,7 @@ class Readline::TestHistory < Test::Unit::TestCase
end
lines.push("#{i + 1}:#{s}")
end
HISTORY.push(*lines)
Readline::HISTORY.push(*lines)
return lines
end
@ -283,11 +250,29 @@ class Readline::TestHistory < Test::Unit::TestCase
def get_default_internal_encoding
return Encoding.default_internal || Encoding.find("locale")
end
end if defined?(::Readline) && defined?(::Readline::HISTORY) &&
end
class Readline::TestHistory < Test::Unit::TestCase
include Readline::BasetestHistory
def setup
use_ext_readline
super
end
end if defined?(::ReadlineSo) && defined?(::ReadlineSo::HISTORY) &&
(
begin
Readline::HISTORY.clear
ReadlineSo::HISTORY.clear
rescue NotImplementedError
false
end
)
class Reline::TestHistory < Test::Unit::TestCase
include Readline::BasetestHistory
def setup
use_lib_reline
super
end
end