summaryrefslogtreecommitdiff
path: root/test/reline/key_actor_emacs_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/reline/key_actor_emacs_test.rb')
-rw-r--r--test/reline/key_actor_emacs_test.rb1173
1 files changed, 1173 insertions, 0 deletions
diff --git a/test/reline/key_actor_emacs_test.rb b/test/reline/key_actor_emacs_test.rb
new file mode 100644
index 0000000000..1fe367597e
--- /dev/null
+++ b/test/reline/key_actor_emacs_test.rb
@@ -0,0 +1,1173 @@
+require 'helper'
+
+class Reline::KeyActor::Emacs::Test < Reline::TestCase
+ def setup
+ @prompt = '> '
+ @config = Reline::Config.new # Emacs mode is default
+ @line_editor = Reline::LineEditor.new(
+ @config, @prompt,
+ (RELINE_TEST_ENCODING rescue Encoding.default_external))
+ @line_editor.retrieve_completion_block = Reline.method(:retrieve_completion_block)
+ end
+
+ def test_ed_insert_one
+ input_keys('a')
+ assert_line('a')
+ assert_byte_pointer_size('a')
+ assert_cursor(1)
+ assert_cursor_max(1)
+ end
+
+ def test_ed_insert_two
+ input_keys('ab')
+ assert_line('ab')
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ end
+
+ def test_ed_insert_mbchar_one
+ input_keys('か')
+ assert_line('か')
+ assert_byte_pointer_size('か')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ end
+
+ def test_ed_insert_mbchar_two
+ input_keys('かき')
+ assert_line('かき')
+ assert_byte_pointer_size('かき')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ end
+
+ def test_ed_insert_for_mbchar_by_plural_code_points
+ input_keys("か\u3099")
+ assert_line("か\u3099")
+ assert_byte_pointer_size("か\u3099")
+ assert_cursor(2)
+ assert_cursor_max(2)
+ end
+
+ def test_ed_insert_for_plural_mbchar_by_plural_code_points
+ input_keys("か\u3099き\u3099")
+ assert_line("か\u3099き\u3099")
+ assert_byte_pointer_size("か\u3099き\u3099")
+ assert_cursor(4)
+ assert_cursor_max(4)
+ end
+
+ def test_move_next_and_prev
+ input_keys('abd')
+ assert_byte_pointer_size('abd')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('a')
+ assert_cursor(1)
+ assert_cursor_max(3)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ input_keys('c')
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(4)
+ assert_line('abcd')
+ end
+
+ def test_move_next_and_prev_for_mbchar
+ input_keys('かきけ')
+ assert_byte_pointer_size('かきけ')
+ assert_cursor(6)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('かき')
+ assert_cursor(4)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('か')
+ assert_cursor(2)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('かき')
+ assert_cursor(4)
+ assert_cursor_max(6)
+ input_keys('く')
+ assert_byte_pointer_size('かきく')
+ assert_cursor(6)
+ assert_cursor_max(8)
+ assert_line('かきくけ')
+ end
+
+ def test_move_next_and_prev_for_mbchar_by_plural_code_points
+ input_keys("か\u3099き\u3099け\u3099")
+ assert_byte_pointer_size("か\u3099き\u3099け\u3099")
+ assert_cursor(6)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size("か\u3099き\u3099")
+ assert_cursor(4)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size("か\u3099")
+ assert_cursor(2)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size("か\u3099き\u3099")
+ assert_cursor(4)
+ assert_cursor_max(6)
+ input_keys("く\u3099")
+ assert_byte_pointer_size("か\u3099き\u3099く\u3099")
+ assert_cursor(6)
+ assert_cursor_max(8)
+ assert_line("か\u3099き\u3099く\u3099け\u3099")
+ end
+
+ def test_move_to_beg_end
+ input_keys('bcd')
+ assert_byte_pointer_size('bcd')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(3)
+ input_keys('a')
+ assert_byte_pointer_size('a')
+ assert_cursor(1)
+ assert_cursor_max(4)
+ input_keys("\C-e", false)
+ assert_byte_pointer_size('abcd')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ input_keys('e')
+ assert_byte_pointer_size('abcde')
+ assert_cursor(5)
+ assert_cursor_max(5)
+ assert_line('abcde')
+ end
+
+ def test_ed_newline_with_cr
+ input_keys('ab')
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ refute(@line_editor.finished?)
+ input_keys("\C-m", false)
+ assert_line('ab')
+ assert(@line_editor.finished?)
+ end
+
+ def test_ed_newline_with_lf
+ input_keys('ab')
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ refute(@line_editor.finished?)
+ input_keys("\C-j", false)
+ assert_line('ab')
+ assert(@line_editor.finished?)
+ end
+
+ def test_em_delete_prev_char
+ input_keys('ab')
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ input_keys("\C-h", false)
+ assert_byte_pointer_size('a')
+ assert_cursor(1)
+ assert_cursor_max(1)
+ assert_line('a')
+ end
+
+ def test_em_delete_prev_char_for_mbchar
+ input_keys('かき')
+ assert_byte_pointer_size('かき')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ input_keys("\C-h", false)
+ assert_byte_pointer_size('か')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ assert_line('か')
+ end
+
+ def test_em_delete_prev_char_for_mbchar_by_plural_code_points
+ input_keys("か\u3099き\u3099")
+ assert_byte_pointer_size("か\u3099き\u3099")
+ assert_cursor(4)
+ assert_cursor_max(4)
+ input_keys("\C-h", false)
+ assert_byte_pointer_size("か\u3099")
+ assert_cursor(2)
+ assert_cursor_max(2)
+ assert_line("か\u3099")
+ end
+
+ def test_ed_kill_line
+ input_keys("\C-k", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ input_keys('abc')
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ input_keys("\C-k", false)
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ assert_line('abc')
+ input_keys("\C-b\C-k", false)
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ assert_line('ab')
+ end
+
+ def test_em_kill_line
+ input_keys("\C-u", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ input_keys('abc')
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ input_keys("\C-u", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ input_keys('abc')
+ input_keys("\C-b\C-u", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(1)
+ assert_line('c')
+ input_keys("\C-u", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(1)
+ assert_line('c')
+ end
+
+ def test_ed_move_to_beg
+ input_keys('abd')
+ assert_byte_pointer_size('abd')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ input_keys('c')
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(4)
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(4)
+ input_keys('012')
+ assert_byte_pointer_size('012')
+ assert_cursor(3)
+ assert_cursor_max(7)
+ assert_line('012abcd')
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(7)
+ input_keys('ABC')
+ assert_byte_pointer_size('ABC')
+ assert_cursor(3)
+ assert_cursor_max(10)
+ assert_line('ABC012abcd')
+ input_keys("\C-f" * 10 + "\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(10)
+ input_keys('a')
+ assert_byte_pointer_size('a')
+ assert_cursor(1)
+ assert_cursor_max(11)
+ assert_line('aABC012abcd')
+ end
+
+ def test_ed_move_to_end
+ input_keys('abd')
+ assert_byte_pointer_size('abd')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ input_keys('c')
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(4)
+ input_keys("\C-e", false)
+ assert_byte_pointer_size('abcd')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ input_keys('012')
+ assert_byte_pointer_size('abcd012')
+ assert_cursor(7)
+ assert_cursor_max(7)
+ assert_line('abcd012')
+ input_keys("\C-e", false)
+ assert_byte_pointer_size('abcd012')
+ assert_cursor(7)
+ assert_cursor_max(7)
+ input_keys('ABC')
+ assert_byte_pointer_size('abcd012ABC')
+ assert_cursor(10)
+ assert_cursor_max(10)
+ assert_line('abcd012ABC')
+ input_keys("\C-b" * 10 + "\C-e", false)
+ assert_byte_pointer_size('abcd012ABC')
+ assert_cursor(10)
+ assert_cursor_max(10)
+ input_keys('a')
+ assert_byte_pointer_size('abcd012ABCa')
+ assert_cursor(11)
+ assert_cursor_max(11)
+ assert_line('abcd012ABCa')
+ end
+
+ def test_em_delete_or_list
+ input_keys('ab')
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(2)
+ input_keys("\C-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(1)
+ assert_line('b')
+ end
+
+ def test_em_delete_or_list_for_mbchar
+ input_keys('かき')
+ assert_byte_pointer_size('かき')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(4)
+ input_keys("\C-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(2)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(2)
+ assert_line('き')
+ end
+
+ def test_em_delete_or_list_for_mbchar_by_plural_code_points
+ input_keys("か\u3099き\u3099")
+ assert_byte_pointer_size("か\u3099き\u3099")
+ assert_cursor(4)
+ assert_cursor_max(4)
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(4)
+ input_keys("\C-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(2)
+ assert_line("き\u3099")
+ end
+
+ def test_ed_clear_screen
+ refute(@line_editor.instance_variable_get(:@cleared))
+ input_keys("\C-l", false)
+ assert(@line_editor.instance_variable_get(:@cleared))
+ end
+
+ def test_ed_clear_screen_with_inputed
+ input_keys('abc')
+ input_keys("\C-b", false)
+ refute(@line_editor.instance_variable_get(:@cleared))
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ input_keys("\C-l", false)
+ assert(@line_editor.instance_variable_get(:@cleared))
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ assert_line('abc')
+ end
+
+ def test_em_next_word
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ input_keys('abc def{bbb}ccc')
+ input_keys("\C-a\M-F", false)
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size('abc def')
+ assert_cursor(7)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size('abc def{bbb')
+ assert_cursor(11)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size('abc def{bbb}ccc')
+ assert_cursor(15)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size('abc def{bbb}ccc')
+ assert_cursor(15)
+ end
+
+ def test_em_next_word_for_mbchar
+ assert_cursor(0)
+ input_keys('あいう かきく{さしす}たちつ')
+ input_keys("\C-a\M-F", false)
+ assert_byte_pointer_size('あいう')
+ assert_cursor(6)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size('あいう かきく')
+ assert_cursor(13)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size('あいう かきく{さしす')
+ assert_cursor(20)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size('あいう かきく{さしす}たちつ')
+ assert_cursor(27)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size('あいう かきく{さしす}たちつ')
+ assert_cursor(27)
+ end
+
+ def test_em_next_word_for_mbchar_by_plural_code_points
+ assert_cursor(0)
+ input_keys("あいう か\u3099き\u3099く\u3099{さしす}たちつ")
+ input_keys("\C-a\M-F", false)
+ assert_byte_pointer_size("あいう")
+ assert_cursor(6)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099")
+ assert_cursor(13)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{さしす")
+ assert_cursor(20)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{さしす}たちつ")
+ assert_cursor(27)
+ input_keys("\M-F", false)
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{さしす}たちつ")
+ assert_cursor(27)
+ end
+
+ def test_em_prev_word
+ input_keys('abc def{bbb}ccc')
+ assert_byte_pointer_size('abc def{bbb}ccc')
+ assert_cursor(15)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('abc def{bbb}')
+ assert_cursor(12)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('abc def{')
+ assert_cursor(8)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('abc ')
+ assert_cursor(4)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ end
+
+ def test_em_prev_word_for_mbchar
+ input_keys('あいう かきく{さしす}たちつ')
+ assert_byte_pointer_size('あいう かきく{さしす}たちつ')
+ assert_cursor(27)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('あいう かきく{さしす}')
+ assert_cursor(21)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('あいう かきく{')
+ assert_cursor(14)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('あいう ')
+ assert_cursor(7)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ end
+
+ def test_em_prev_word_for_mbchar_by_plural_code_points
+ input_keys("あいう か\u3099き\u3099く\u3099{さしす}たちつ")
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{さしす}たちつ")
+ assert_cursor(27)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{さしす}")
+ assert_cursor(21)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{")
+ assert_cursor(14)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('あいう ')
+ assert_cursor(7)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ input_keys("\M-B", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ end
+
+ def test_em_delete_next_word
+ input_keys('abc def{bbb}ccc')
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(15)
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(12)
+ assert_line(' def{bbb}ccc')
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(8)
+ assert_line('{bbb}ccc')
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(4)
+ assert_line('}ccc')
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ end
+
+ def test_em_delete_next_word_for_mbchar
+ input_keys('あいう かきく{さしす}たちつ')
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(27)
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(21)
+ assert_line(' かきく{さしす}たちつ')
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(14)
+ assert_line('{さしす}たちつ')
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(7)
+ assert_line('}たちつ')
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ end
+
+ def test_em_delete_next_word_for_mbchar_by_plural_code_points
+ input_keys("あいう か\u3099き\u3099く\u3099{さしす}たちつ")
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(27)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(27)
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(21)
+ assert_line(" か\u3099き\u3099く\u3099{さしす}たちつ")
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(14)
+ assert_line('{さしす}たちつ')
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(7)
+ assert_line('}たちつ')
+ input_keys("\M-d", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ end
+
+ def test_ed_delete_prev_word
+ input_keys('abc def{bbb}ccc')
+ assert_byte_pointer_size('abc def{bbb}ccc')
+ assert_cursor(15)
+ assert_cursor_max(15)
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('abc def{bbb}')
+ assert_cursor(12)
+ assert_cursor_max(12)
+ assert_line('abc def{bbb}')
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('abc def{')
+ assert_cursor(8)
+ assert_cursor_max(8)
+ assert_line('abc def{')
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('abc ')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ assert_line('abc ')
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ end
+
+ def test_ed_delete_prev_word_for_mbchar
+ input_keys('あいう かきく{さしす}たちつ')
+ assert_byte_pointer_size('あいう かきく{さしす}たちつ')
+ assert_cursor(27)
+ assert_cursor_max(27)
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('あいう かきく{さしす}')
+ assert_cursor(21)
+ assert_cursor_max(21)
+ assert_line('あいう かきく{さしす}')
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('あいう かきく{')
+ assert_cursor(14)
+ assert_cursor_max(14)
+ assert_line('あいう かきく{')
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('あいう ')
+ assert_cursor(7)
+ assert_cursor_max(7)
+ assert_line('あいう ')
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ end
+
+ def test_ed_delete_prev_word_for_mbchar_by_plural_code_points
+ input_keys("あいう か\u3099き\u3099く\u3099{さしす}たちつ")
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{さしす}たちつ")
+ assert_cursor(27)
+ assert_cursor_max(27)
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{さしす}")
+ assert_cursor(21)
+ assert_cursor_max(21)
+ assert_line("あいう か\u3099き\u3099く\u3099{さしす}")
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size("あいう か\u3099き\u3099く\u3099{")
+ assert_cursor(14)
+ assert_cursor_max(14)
+ assert_line("あいう か\u3099き\u3099く\u3099{")
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size("あいう ")
+ assert_cursor(7)
+ assert_cursor_max(7)
+ assert_line('あいう ')
+ input_keys("\M-\C-H", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ end
+
+ def test_ed_transpose_chars
+ input_keys('abc')
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(3)
+ input_keys("\C-t", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(3)
+ assert_line('abc')
+ input_keys("\C-f\C-t", false)
+ assert_byte_pointer_size('ba')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ assert_line('bac')
+ input_keys("\C-t", false)
+ assert_byte_pointer_size('bca')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ assert_line('bca')
+ input_keys("\C-t", false)
+ assert_byte_pointer_size('bac')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ assert_line('bac')
+ end
+
+ def test_ed_transpose_chars_for_mbchar
+ input_keys('あかさ')
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(6)
+ input_keys("\C-t", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(6)
+ assert_line('あかさ')
+ input_keys("\C-f\C-t", false)
+ assert_byte_pointer_size('かあ')
+ assert_cursor(4)
+ assert_cursor_max(6)
+ assert_line('かあさ')
+ input_keys("\C-t", false)
+ assert_byte_pointer_size('かさあ')
+ assert_cursor(6)
+ assert_cursor_max(6)
+ assert_line('かさあ')
+ input_keys("\C-t", false)
+ assert_byte_pointer_size('かあさ')
+ assert_cursor(6)
+ assert_cursor_max(6)
+ assert_line('かあさ')
+ end
+
+ def test_ed_transpose_chars_for_mbchar_by_plural_code_points
+ input_keys("あか\u3099さ")
+ input_keys("\C-a", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(6)
+ input_keys("\C-t", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(6)
+ assert_line("あか\u3099さ")
+ input_keys("\C-f\C-t", false)
+ assert_byte_pointer_size("か\u3099あ")
+ assert_cursor(4)
+ assert_cursor_max(6)
+ assert_line("か\u3099あさ")
+ input_keys("\C-t", false)
+ assert_byte_pointer_size("か\u3099さあ")
+ assert_cursor(6)
+ assert_cursor_max(6)
+ assert_line("か\u3099さあ")
+ input_keys("\C-t", false)
+ assert_byte_pointer_size("か\u3099あさ")
+ assert_cursor(6)
+ assert_cursor_max(6)
+ assert_line("か\u3099あさ")
+ end
+
+ def test_ed_digit
+ input_keys('0123')
+ assert_byte_pointer_size('0123')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ assert_line('0123')
+ end
+
+ def test_ed_next_and_prev_char
+ input_keys('abc')
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('a')
+ assert_cursor(1)
+ assert_cursor_max(3)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(3)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(3)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('a')
+ assert_cursor(1)
+ assert_cursor_max(3)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('ab')
+ assert_cursor(2)
+ assert_cursor_max(3)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(3)
+ end
+
+ def test_ed_next_and_prev_char_for_mbchar
+ input_keys('あいう')
+ assert_byte_pointer_size('あいう')
+ assert_cursor(6)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('あい')
+ assert_cursor(4)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('あ')
+ assert_cursor(2)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('あ')
+ assert_cursor(2)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('あい')
+ assert_cursor(4)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('あいう')
+ assert_cursor(6)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size('あいう')
+ assert_cursor(6)
+ assert_cursor_max(6)
+ end
+
+ def test_ed_next_and_prev_char_for_mbchar_by_plural_code_points
+ input_keys("か\u3099き\u3099く\u3099")
+ assert_byte_pointer_size("か\u3099き\u3099く\u3099")
+ assert_cursor(6)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size("か\u3099き\u3099")
+ assert_cursor(4)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size("か\u3099")
+ assert_cursor(2)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(6)
+ input_keys("\C-b", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size("か\u3099")
+ assert_cursor(2)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size("か\u3099き\u3099")
+ assert_cursor(4)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size("か\u3099き\u3099く\u3099")
+ assert_cursor(6)
+ assert_cursor_max(6)
+ input_keys("\C-f", false)
+ assert_byte_pointer_size("か\u3099き\u3099く\u3099")
+ assert_cursor(6)
+ assert_cursor_max(6)
+ end
+
+ def test_em_capitol_case
+ input_keys('abc def{bbb}ccc')
+ input_keys("\C-a\M-c", false)
+ assert_byte_pointer_size('Abc')
+ assert_cursor(3)
+ assert_cursor_max(15)
+ assert_line('Abc def{bbb}ccc')
+ input_keys("\M-c", false)
+ assert_byte_pointer_size('Abc Def')
+ assert_cursor(7)
+ assert_cursor_max(15)
+ assert_line('Abc Def{bbb}ccc')
+ input_keys("\M-c", false)
+ assert_byte_pointer_size('Abc Def{Bbb')
+ assert_cursor(11)
+ assert_cursor_max(15)
+ assert_line('Abc Def{Bbb}ccc')
+ input_keys("\M-c", false)
+ assert_byte_pointer_size('Abc Def{Bbb}Ccc')
+ assert_cursor(15)
+ assert_cursor_max(15)
+ assert_line('Abc Def{Bbb}Ccc')
+ end
+
+ def test_em_capitol_case_with_complex_example
+ input_keys('{}#* AaA!!!cCc ')
+ input_keys("\C-a\M-c", false)
+ assert_byte_pointer_size('{}#* Aaa')
+ assert_cursor(11)
+ assert_cursor_max(20)
+ assert_line('{}#* Aaa!!!cCc ')
+ input_keys("\M-c", false)
+ assert_byte_pointer_size('{}#* Aaa!!!Ccc')
+ assert_cursor(17)
+ assert_cursor_max(20)
+ assert_line('{}#* Aaa!!!Ccc ')
+ input_keys("\M-c", false)
+ assert_byte_pointer_size('{}#* Aaa!!!Ccc ')
+ assert_cursor(20)
+ assert_cursor_max(20)
+ assert_line('{}#* Aaa!!!Ccc ')
+ end
+
+ def test_em_lower_case
+ input_keys('AbC def{bBb}CCC')
+ input_keys("\C-a\M-l", false)
+ assert_byte_pointer_size('abc')
+ assert_cursor(3)
+ assert_cursor_max(15)
+ assert_line('abc def{bBb}CCC')
+ input_keys("\M-l", false)
+ assert_byte_pointer_size('abc def')
+ assert_cursor(7)
+ assert_cursor_max(15)
+ assert_line('abc def{bBb}CCC')
+ input_keys("\M-l", false)
+ assert_byte_pointer_size('abc def{bbb')
+ assert_cursor(11)
+ assert_cursor_max(15)
+ assert_line('abc def{bbb}CCC')
+ input_keys("\M-l", false)
+ assert_byte_pointer_size('abc def{bbb}ccc')
+ assert_cursor(15)
+ assert_cursor_max(15)
+ assert_line('abc def{bbb}ccc')
+ end
+
+ def test_em_lower_case_with_complex_example
+ input_keys('{}#* AaA!!!cCc ')
+ input_keys("\C-a\M-l", false)
+ assert_byte_pointer_size('{}#* aaa')
+ assert_cursor(11)
+ assert_cursor_max(20)
+ assert_line('{}#* aaa!!!cCc ')
+ input_keys("\M-l", false)
+ assert_byte_pointer_size('{}#* aaa!!!ccc')
+ assert_cursor(17)
+ assert_cursor_max(20)
+ assert_line('{}#* aaa!!!ccc ')
+ input_keys("\M-l", false)
+ assert_byte_pointer_size('{}#* aaa!!!ccc ')
+ assert_cursor(20)
+ assert_cursor_max(20)
+ assert_line('{}#* aaa!!!ccc ')
+ end
+
+ def test_em_upper_case
+ input_keys('AbC def{bBb}CCC')
+ input_keys("\C-a\M-u", false)
+ assert_byte_pointer_size('ABC')
+ assert_cursor(3)
+ assert_cursor_max(15)
+ assert_line('ABC def{bBb}CCC')
+ input_keys("\M-u", false)
+ assert_byte_pointer_size('ABC DEF')
+ assert_cursor(7)
+ assert_cursor_max(15)
+ assert_line('ABC DEF{bBb}CCC')
+ input_keys("\M-u", false)
+ assert_byte_pointer_size('ABC DEF{BBB')
+ assert_cursor(11)
+ assert_cursor_max(15)
+ assert_line('ABC DEF{BBB}CCC')
+ input_keys("\M-u", false)
+ assert_byte_pointer_size('ABC DEF{BBB}CCC')
+ assert_cursor(15)
+ assert_cursor_max(15)
+ assert_line('ABC DEF{BBB}CCC')
+ end
+
+ def test_em_upper_case_with_complex_example
+ input_keys('{}#* AaA!!!cCc ')
+ input_keys("\C-a\M-u", false)
+ assert_byte_pointer_size('{}#* AAA')
+ assert_cursor(11)
+ assert_cursor_max(20)
+ assert_line('{}#* AAA!!!cCc ')
+ input_keys("\M-u", false)
+ assert_byte_pointer_size('{}#* AAA!!!CCC')
+ assert_cursor(17)
+ assert_cursor_max(20)
+ assert_line('{}#* AAA!!!CCC ')
+ input_keys("\M-u", false)
+ assert_byte_pointer_size('{}#* AAA!!!CCC ')
+ assert_cursor(20)
+ assert_cursor_max(20)
+ assert_line('{}#* AAA!!!CCC ')
+ end
+
+ def test_completion
+ $stdout = StringIO.new
+ @line_editor.completion_proc = proc { |word|
+ %w{
+ foo_foo
+ foo_bar
+ foo_baz
+ qux
+ }
+ }
+ input_keys('fo')
+ assert_byte_pointer_size('fo')
+ assert_cursor(2)
+ assert_cursor_max(2)
+ assert_line('fo')
+ assert_equal('', $stdout.string)
+ input_keys("\C-i", false)
+ assert_byte_pointer_size('foo_')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ assert_line('foo_')
+ assert_equal('', $stdout.string)
+ input_keys("\C-i", false)
+ assert_byte_pointer_size('foo_')
+ assert_cursor(4)
+ assert_cursor_max(4)
+ assert_line('foo_')
+ assert_equal(<<~OUTPUT, $stdout.string)
+
+ foo_foo
+ foo_bar
+ foo_baz
+ OUTPUT
+ input_keys('a')
+ input_keys("\C-i", false)
+ assert_byte_pointer_size('foo_a')
+ assert_cursor(5)
+ assert_cursor_max(5)
+ assert_line('foo_a')
+ input_keys("\C-h", false)
+ input_keys('b')
+ input_keys("\C-i", false)
+ assert_byte_pointer_size('foo_ba')
+ assert_cursor(6)
+ assert_cursor_max(6)
+ assert_line('foo_ba')
+ $stdout = STDOUT
+ end
+
+ def test_completion_in_middle_of_line
+ @line_editor.completion_proc = proc { |word|
+ %w{
+ foo_foo
+ foo_bar
+ foo_baz
+ qux
+ }
+ }
+ input_keys('abcde fo ABCDE')
+ assert_line('abcde fo ABCDE')
+ input_keys("\C-b" * 6 + "\C-i", false)
+ assert_byte_pointer_size('abcde foo_')
+ assert_cursor(10)
+ assert_cursor_max(16)
+ assert_line('abcde foo_ ABCDE')
+ input_keys("\C-b" * 2 + "\C-i", false)
+ assert_byte_pointer_size('abcde foo_')
+ assert_cursor(10)
+ assert_cursor_max(18)
+ assert_line('abcde foo_o_ ABCDE')
+ end
+
+ def test_em_kill_region
+ input_keys('abc def{bbb}ccc ddd ')
+ assert_byte_pointer_size('abc def{bbb}ccc ddd ')
+ assert_cursor(26)
+ assert_cursor_max(26)
+ assert_line('abc def{bbb}ccc ddd ')
+ input_keys("\C-w", false)
+ assert_byte_pointer_size('abc def{bbb}ccc ')
+ assert_cursor(20)
+ assert_cursor_max(20)
+ assert_line('abc def{bbb}ccc ')
+ input_keys("\C-w", false)
+ assert_byte_pointer_size('abc ')
+ assert_cursor(6)
+ assert_cursor_max(6)
+ assert_line('abc ')
+ input_keys("\C-w", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ input_keys("\C-w", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ end
+
+ def test_em_kill_region_mbchar
+ input_keys('あ い う{う}う ')
+ assert_byte_pointer_size('あ い う{う}う ')
+ assert_cursor(21)
+ assert_cursor_max(21)
+ assert_line('あ い う{う}う ')
+ input_keys("\C-w", false)
+ assert_byte_pointer_size('あ い ')
+ assert_cursor(10)
+ assert_cursor_max(10)
+ assert_line('あ い ')
+ input_keys("\C-w", false)
+ assert_byte_pointer_size('あ ')
+ assert_cursor(5)
+ assert_cursor_max(5)
+ assert_line('あ ')
+ input_keys("\C-w", false)
+ assert_byte_pointer_size('')
+ assert_cursor(0)
+ assert_cursor_max(0)
+ assert_line('')
+ end
+end