about summary refs log tree commit diff stats
path: root/text_tests.lua
diff options
context:
space:
mode:
Diffstat (limited to 'text_tests.lua')
-rw-r--r--text_tests.lua622
1 files changed, 7 insertions, 615 deletions
diff --git a/text_tests.lua b/text_tests.lua
index 962de7d..79c38c5 100644
--- a/text_tests.lua
+++ b/text_tests.lua
@@ -15,43 +15,6 @@ function test_initial_state()
   check_eq(Editor_state.screen_top1.pos, 1, 'screen_top:pos')
 end
 
-function test_backspace_from_start_of_final_line()
-  -- display final line of text with cursor at start of it
-  App.screen.init{width=120, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def'}
-  Editor_state.screen_top1 = {line=2, pos=1}
-  Editor_state.cursor1 = {line=2, pos=1}
-  Text.redraw_all(Editor_state)
-  -- backspace scrolls up
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(#Editor_state.lines, 1, '#lines')
-  check_eq(Editor_state.cursor1.line, 1, 'cursor')
-  check_eq(Editor_state.screen_top1.line, 1, 'screen_top')
-end
-
-function test_insert_first_character()
-  App.screen.init{width=120, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{}
-  Text.redraw_all(Editor_state)
-  edit.draw(Editor_state)
-  edit.run_after_text_input(Editor_state, 'a')
-  local y = Editor_state.top
-  App.screen.check(y, 'a', 'screen:1')
-end
-
-function test_press_ctrl()
-  -- press ctrl while the cursor is on text
-  App.screen.init{width=50, height=80}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{''}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=1}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.run_after_keychord(Editor_state, 'C-m', 'm')
-end
-
 function test_move_left()
   App.screen.init{width=120, height=60}
   Editor_state = edit.initialize_test_state()
@@ -575,43 +538,6 @@ function test_cursor_movement_without_shift_resets_selection()
   check_eq(Editor_state.lines[1].data, 'abc', 'data')
 end
 
-function test_edit_deletes_selection()
-  -- display a line of text with some part selected
-  App.screen.init{width=75, height=80}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=1}
-  Editor_state.selection1 = {line=1, pos=2}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  -- press a key
-  edit.run_after_text_input(Editor_state, 'x')
-  -- selected text is deleted and replaced with the key
-  check_eq(Editor_state.lines[1].data, 'xbc', 'check')
-end
-
-function test_edit_with_shift_key_deletes_selection()
-  -- display a line of text with some part selected
-  App.screen.init{width=75, height=80}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=1}
-  Editor_state.selection1 = {line=1, pos=2}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  -- mimic precise keypresses for a capital letter
-  App.fake_key_press('lshift')
-  edit.keychord_press(Editor_state, 'd', 'd')
-  edit.text_input(Editor_state, 'D')
-  edit.key_release(Editor_state, 'd')
-  App.fake_key_release('lshift')
-  -- selected text is deleted and replaced with the key
-  check_nil(Editor_state.selection1.line, 'check')
-  check_eq(Editor_state.lines[1].data, 'Dbc', 'data')
-end
-
 function test_copy_does_not_reset_selection()
   -- display a line of text with a selection
   App.screen.init{width=75, height=80}
@@ -629,154 +555,21 @@ function test_copy_does_not_reset_selection()
   check(Editor_state.selection1.line, 'check')
 end
 
-function test_cut()
-  -- display a line of text with some part selected
-  App.screen.init{width=75, height=80}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=1}
-  Editor_state.selection1 = {line=1, pos=2}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  -- press a key
-  edit.run_after_keychord(Editor_state, 'C-x', 'x')
-  check_eq(App.clipboard, 'a', 'clipboard')
-  -- selected text is deleted
-  check_eq(Editor_state.lines[1].data, 'bc', 'data')
-end
-
-function test_paste_replaces_selection()
-  -- display a line of text with a selection
-  App.screen.init{width=75, height=80}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=2, pos=1}
-  Editor_state.selection1 = {line=1, pos=1}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  -- set clipboard
-  App.clipboard = 'xyz'
-  -- paste selection
-  edit.run_after_keychord(Editor_state, 'C-v', 'v')
-  -- selection is reset since shift key is not pressed
-  -- selection includes the newline, so it's also deleted
-  check_eq(Editor_state.lines[1].data, 'xyzdef', 'check')
-end
-
-function test_deleting_selection_may_scroll()
-  -- display lines 2/3/4
-  App.screen.init{width=120, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=3, pos=2}
-  Editor_state.screen_top1 = {line=2, pos=1}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'def', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'ghi', 'baseline/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'jkl', 'baseline/screen:3')
-  -- set up a selection starting above the currently displayed page
-  Editor_state.selection1 = {line=1, pos=2}
-  -- delete selection
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  -- page scrolls up
-  check_eq(Editor_state.screen_top1.line, 1, 'check')
-  check_eq(Editor_state.lines[1].data, 'ahi', 'data')
-end
+function test_move_cursor_using_mouse()
 
-function test_edit_wrapping_text()
   App.screen.init{width=50, height=60}
   Editor_state = edit.initialize_test_state()
   Editor_state.lines = load_array{'abc', 'def', 'xyz'}
   Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=2, pos=4}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  edit.run_after_text_input(Editor_state, 'g')
-  local y = Editor_state.top
-  App.screen.check(y, 'abc', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'de', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'fg', 'screen:3')
-end
-
-function test_insert_newline()
-  -- display a few lines
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=2}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'abc', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'def', 'baseline/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'ghi', 'baseline/screen:3')
-  -- hitting the enter key splits the line
-  edit.run_after_keychord(Editor_state, 'return', 'return')
-  check_eq(Editor_state.screen_top1.line, 1, 'screen_top')
-  check_eq(Editor_state.cursor1.line, 2, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 1, 'cursor:pos')
-  y = Editor_state.top
-  App.screen.check(y, 'a', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'bc', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'def', 'screen:3')
-end
-
-function test_insert_newline_at_start_of_line()
-  -- display a line
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc'}
-  Text.redraw_all(Editor_state)
   Editor_state.cursor1 = {line=1, pos=1}
   Editor_state.screen_top1 = {line=1, pos=1}
-  -- hitting the enter key splits the line
-  edit.run_after_keychord(Editor_state, 'return', 'return')
-  check_eq(Editor_state.cursor1.line, 2, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 1, 'cursor:pos')
-  check_eq(Editor_state.lines[1].data, '', 'data:1')
-  check_eq(Editor_state.lines[2].data, 'abc', 'data:2')
-end
-
-function test_insert_from_clipboard()
-  -- display a few lines
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=2}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'abc', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'def', 'baseline/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'ghi', 'baseline/screen:3')
-  -- paste some text including a newline, check that new line is created
-  App.clipboard = 'xy\nz'
-  edit.run_after_keychord(Editor_state, 'C-v', 'v')
-  check_eq(Editor_state.screen_top1.line, 1, 'screen_top')
-  check_eq(Editor_state.cursor1.line, 2, 'cursor:line')
+  Editor_state.selection1 = {}
+  edit.draw(Editor_state)  -- populate line_cache.startpos for each line
+  edit.run_after_mouse_release(Editor_state, Editor_state.left+8,Editor_state.top+5, 1)
+  check_eq(Editor_state.cursor1.line, 1, 'cursor:line')
   check_eq(Editor_state.cursor1.pos, 2, 'cursor:pos')
-  y = Editor_state.top
-  App.screen.check(y, 'axy', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'zbc', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'def', 'screen:3')
+  check_nil(Editor_state.selection1.line, 'selection:line')
+  check_nil(Editor_state.selection1.pos, 'selection:pos')
 end
 
 function test_select_text_using_mouse()
@@ -930,22 +723,6 @@ function test_select_all_text()
   check_eq(Editor_state.cursor1.pos, 8, 'cursor:pos')
 end
 
-function test_cut_without_selection()
-  -- display a few lines
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=2}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  Editor_state.selection1 = {}
-  edit.draw(Editor_state)
-  -- try to cut without selecting text
-  edit.run_after_keychord(Editor_state, 'C-x', 'x')
-  -- no crash
-  check_nil(Editor_state.selection1.line, 'check')
-end
-
 function test_pagedown()
   App.screen.init{width=120, height=45}
   Editor_state = edit.initialize_test_state()
@@ -1376,104 +1153,6 @@ function test_pageup_scrolls_up_from_middle_screen_line()
   App.screen.check(y, 'ghi ', 'screen:3')
 end
 
-function test_enter_on_bottom_line_scrolls_down()
-  -- display a few lines with cursor on bottom line
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=3, pos=2}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'abc', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'def', 'baseline/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'ghi', 'baseline/screen:3')
-  -- after hitting the enter key the screen scrolls down
-  edit.run_after_keychord(Editor_state, 'return', 'return')
-  check_eq(Editor_state.screen_top1.line, 2, 'screen_top')
-  check_eq(Editor_state.cursor1.line, 4, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 1, 'cursor:pos')
-  y = Editor_state.top
-  App.screen.check(y, 'def', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'g', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'hi', 'screen:3')
-end
-
-function test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom()
-  -- display just the bottom line on screen
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=4, pos=2}
-  Editor_state.screen_top1 = {line=4, pos=1}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'jkl', 'baseline/screen:1')
-  -- after hitting the enter key the screen does not scroll down
-  edit.run_after_keychord(Editor_state, 'return', 'return')
-  check_eq(Editor_state.screen_top1.line, 4, 'screen_top')
-  check_eq(Editor_state.cursor1.line, 5, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 1, 'cursor:pos')
-  y = Editor_state.top
-  App.screen.check(y, 'j', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'kl', 'screen:2')
-end
-
-function test_inserting_text_on_final_line_avoids_scrolling_down_when_not_at_bottom()
-  -- display just an empty bottom line on screen
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', ''}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=2, pos=1}
-  Editor_state.screen_top1 = {line=2, pos=1}
-  edit.draw(Editor_state)
-  -- after hitting the inserting_text key the screen does not scroll down
-  edit.run_after_text_input(Editor_state, 'a')
-  check_eq(Editor_state.screen_top1.line, 2, 'screen_top')
-  check_eq(Editor_state.cursor1.line, 2, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 2, 'cursor:pos')
-  local y = Editor_state.top
-  App.screen.check(y, 'a', 'screen:1')
-end
-
-function test_typing_on_bottom_line_scrolls_down()
-  -- display a few lines with cursor on bottom line
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=3, pos=4}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'abc', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'def', 'baseline/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'ghi', 'baseline/screen:3')
-  -- after typing something the line wraps and the screen scrolls down
-  edit.run_after_text_input(Editor_state, 'j')
-  edit.run_after_text_input(Editor_state, 'k')
-  edit.run_after_text_input(Editor_state, 'l')
-  check_eq(Editor_state.screen_top1.line, 2, 'screen_top')
-  check_eq(Editor_state.cursor1.line, 3, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 7, 'cursor:pos')
-  y = Editor_state.top
-  App.screen.check(y, 'def', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'ghij', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'kl', 'screen:3')
-end
-
 function test_left_arrow_scrolls_up_in_wrapped_line()
   -- display lines starting from second screen line of a line
   App.screen.init{width=Editor_state.left+30, height=60}
@@ -1588,293 +1267,6 @@ function test_end_scrolls_down_in_wrapped_line()
   App.screen.check(y, 'jkl', 'screen:3')
 end
 
-function test_position_cursor_on_recently_edited_wrapping_line()
-  -- draw a line wrapping over 2 screen lines
-  App.screen.init{width=100, height=200}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc def ghi jkl mno pqr ', 'xyz'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=25}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'abc def ghi ', 'baseline1/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'jkl mno pqr ', 'baseline1/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'xyz', 'baseline1/screen:3')
-  -- add to the line until it's wrapping over 3 screen lines
-  edit.run_after_text_input(Editor_state, 's')
-  edit.run_after_text_input(Editor_state, 't')
-  edit.run_after_text_input(Editor_state, 'u')
-  check_eq(Editor_state.cursor1.pos, 28, 'cursor:pos')
-  y = Editor_state.top
-  App.screen.check(y, 'abc def ghi ', 'baseline2/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'jkl mno pqr ', 'baseline2/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'stu', 'baseline2/screen:3')
-  -- try to move the cursor earlier in the third screen line by clicking the mouse
-  edit.run_after_mouse_release(Editor_state, Editor_state.left+2,Editor_state.top+Editor_state.line_height*2+5, 1)
-  -- cursor should move
-  check_eq(Editor_state.cursor1.line, 1, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 25, 'cursor:pos')
-end
-
-function test_backspace_can_scroll_up()
-  -- display the lines 2/3/4 with the cursor on line 2
-  App.screen.init{width=120, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=2, pos=1}
-  Editor_state.screen_top1 = {line=2, pos=1}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'def', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'ghi', 'baseline/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'jkl', 'baseline/screen:3')
-  -- after hitting backspace the screen scrolls up by one line
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(Editor_state.screen_top1.line, 1, 'screen_top')
-  check_eq(Editor_state.cursor1.line, 1, 'cursor')
-  y = Editor_state.top
-  App.screen.check(y, 'abcdef', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'ghi', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'jkl', 'screen:3')
-end
-
-function test_backspace_can_scroll_up_screen_line()
-  -- display lines starting from second screen line of a line
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi jkl', 'mno'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=3, pos=5}
-  Editor_state.screen_top1 = {line=3, pos=5}
-  edit.draw(Editor_state)
-  local y = Editor_state.top
-  App.screen.check(y, 'jkl', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'mno', 'baseline/screen:2')
-  -- after hitting backspace the screen scrolls up by one screen line
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  y = Editor_state.top
-  App.screen.check(y, 'ghij', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'kl', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'mno', 'screen:3')
-  check_eq(Editor_state.screen_top1.line, 3, 'screen_top:line')
-  check_eq(Editor_state.screen_top1.pos, 1, 'screen_top:pos')
-  check_eq(Editor_state.cursor1.line, 3, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 4, 'cursor:pos')
-end
-
-function test_backspace_past_line_boundary()
-  -- position cursor at start of a (non-first) line
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=2, pos=1}
-  -- backspace joins with previous line
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(Editor_state.lines[1].data, 'abcdef', 'check')
-end
-
--- some tests for operating over selections created using Shift- chords
--- we're just testing delete_selection, and it works the same for all keys
-
-function test_backspace_over_selection()
-  -- select just one character within a line with cursor before selection
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl', 'mno'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=1}
-  Editor_state.selection1 = {line=1, pos=2}
-  -- backspace deletes the selected character, even though it's after the cursor
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(Editor_state.lines[1].data, 'bc', 'data')
-  -- cursor (remains) at start of selection
-  check_eq(Editor_state.cursor1.line, 1, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 1, 'cursor:pos')
-  -- selection is cleared
-  check_nil(Editor_state.selection1.line, 'selection')
-end
-
-function test_backspace_over_selection_reverse()
-  -- select just one character within a line with cursor after selection
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl', 'mno'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=2}
-  Editor_state.selection1 = {line=1, pos=1}
-  -- backspace deletes the selected character
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(Editor_state.lines[1].data, 'bc', 'data')
-  -- cursor moves to start of selection
-  check_eq(Editor_state.cursor1.line, 1, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 1, 'cursor:pos')
-  -- selection is cleared
-  check_nil(Editor_state.selection1.line, 'selection')
-end
-
-function test_backspace_over_multiple_lines()
-  -- select just one character within a line with cursor after selection
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl', 'mno'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=2}
-  Editor_state.selection1 = {line=4, pos=2}
-  -- backspace deletes the region and joins the remaining portions of lines on either side
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(Editor_state.lines[1].data, 'akl', 'data:1')
-  check_eq(Editor_state.lines[2].data, 'mno', 'data:2')
-  -- cursor remains at start of selection
-  check_eq(Editor_state.cursor1.line, 1, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 2, 'cursor:pos')
-  -- selection is cleared
-  check_nil(Editor_state.selection1.line, 'selection')
-end
-
-function test_backspace_to_end_of_line()
-  -- select region from cursor to end of line
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl', 'mno'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=2}
-  Editor_state.selection1 = {line=1, pos=4}
-  -- backspace deletes rest of line without joining to any other line
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(Editor_state.lines[1].data, 'a', 'data:1')
-  check_eq(Editor_state.lines[2].data, 'def', 'data:2')
-  -- cursor remains at start of selection
-  check_eq(Editor_state.cursor1.line, 1, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 2, 'cursor:pos')
-  -- selection is cleared
-  check_nil(Editor_state.selection1.line, 'selection')
-end
-
-function test_backspace_to_start_of_line()
-  -- select region from cursor to start of line
-  App.screen.init{width=Editor_state.left+30, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'ghi', 'jkl', 'mno'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=2, pos=1}
-  Editor_state.selection1 = {line=2, pos=3}
-  -- backspace deletes beginning of line without joining to any other line
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(Editor_state.lines[1].data, 'abc', 'data:1')
-  check_eq(Editor_state.lines[2].data, 'f', 'data:2')
-  -- cursor remains at start of selection
-  check_eq(Editor_state.cursor1.line, 2, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 1, 'cursor:pos')
-  -- selection is cleared
-  check_nil(Editor_state.selection1.line, 'selection')
-end
-
-function test_undo_insert_text()
-  App.screen.init{width=120, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'def', 'xyz'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=2, pos=4}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  -- insert a character
-  edit.draw(Editor_state)
-  edit.run_after_text_input(Editor_state, 'g')
-  check_eq(Editor_state.cursor1.line, 2, 'baseline/cursor:line')
-  check_eq(Editor_state.cursor1.pos, 5, 'baseline/cursor:pos')
-  check_nil(Editor_state.selection1.line, 'baseline/selection:line')
-  check_nil(Editor_state.selection1.pos, 'baseline/selection:pos')
-  local y = Editor_state.top
-  App.screen.check(y, 'abc', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'defg', 'baseline/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'xyz', 'baseline/screen:3')
-  -- undo
-  edit.run_after_keychord(Editor_state, 'C-z', 'z')
-  check_eq(Editor_state.cursor1.line, 2, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 4, 'cursor:pos')
-  check_nil(Editor_state.selection1.line, 'selection:line')
-  check_nil(Editor_state.selection1.pos, 'selection:pos')
-  y = Editor_state.top
-  App.screen.check(y, 'abc', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'def', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'xyz', 'screen:3')
-end
-
-function test_undo_delete_text()
-  App.screen.init{width=120, height=60}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc', 'defg', 'xyz'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=2, pos=5}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  -- delete a character
-  edit.run_after_keychord(Editor_state, 'backspace', 'backspace')
-  check_eq(Editor_state.cursor1.line, 2, 'baseline/cursor:line')
-  check_eq(Editor_state.cursor1.pos, 4, 'baseline/cursor:pos')
-  check_nil(Editor_state.selection1.line, 'baseline/selection:line')
-  check_nil(Editor_state.selection1.pos, 'baseline/selection:pos')
-  local y = Editor_state.top
-  App.screen.check(y, 'abc', 'baseline/screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'def', 'baseline/screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'xyz', 'baseline/screen:3')
-  -- undo
---?   -- after undo, the backspaced key is selected
-  edit.run_after_keychord(Editor_state, 'C-z', 'z')
-  check_eq(Editor_state.cursor1.line, 2, 'cursor:line')
-  check_eq(Editor_state.cursor1.pos, 5, 'cursor:pos')
-  check_nil(Editor_state.selection1.line, 'selection:line')
-  check_nil(Editor_state.selection1.pos, 'selection:pos')
---?   check_eq(Editor_state.selection1.line, 2, 'selection:line')
---?   check_eq(Editor_state.selection1.pos, 4, 'selection:pos')
-  y = Editor_state.top
-  App.screen.check(y, 'abc', 'screen:1')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'defg', 'screen:2')
-  y = y + Editor_state.line_height
-  App.screen.check(y, 'xyz', 'screen:3')
-end
-
-function test_undo_restores_selection()
-  -- display a line of text with some part selected
-  App.screen.init{width=75, height=80}
-  Editor_state = edit.initialize_test_state()
-  Editor_state.lines = load_array{'abc'}
-  Text.redraw_all(Editor_state)
-  Editor_state.cursor1 = {line=1, pos=1}
-  Editor_state.selection1 = {line=1, pos=2}
-  Editor_state.screen_top1 = {line=1, pos=1}
-  edit.draw(Editor_state)
-  -- delete selected text
-  edit.run_after_text_input(Editor_state, 'x')
-  check_eq(Editor_state.lines[1].data, 'xbc', 'baseline')
-  check_nil(Editor_state.selection1.line, 'baseline:selection')
-  -- undo
-  edit.run_after_keychord(Editor_state, 'C-z', 'z')
-  edit.run_after_keychord(Editor_state, 'C-z', 'z')
-  -- selection is restored
-  check_eq(Editor_state.selection1.line, 1, 'line')
-  check_eq(Editor_state.selection1.pos, 2, 'pos')
-end
-
 function test_search()
   App.screen.init{width=120, height=60}
   Editor_state = edit.initialize_test_state()
/mu/commit/html/072channel.mu.html?h=main&id=a654e4ecace2d506d1b10f1dde2c287ebe84ef37'>a654e4ec ^
dea90217 ^




a654e4ec ^





32b8fac2 ^



a654e4ec ^


32b8fac2 ^
a654e4ec ^
32b8fac2 ^
a654e4ec ^


32b8fac2 ^
a654e4ec ^

32b8fac2 ^
a654e4ec ^


32b8fac2 ^
a654e4ec ^

32b8fac2 ^
a654e4ec ^


32b8fac2 ^
a654e4ec ^

32b8fac2 ^
a654e4ec ^












1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471