2022-06-03 22:14:53 +01:00
-- major tests for text editing flows
2022-06-14 17:26:18 +01:00
function test_initial_state ( )
io.write ( ' \n test_initial_state ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 22:18:50 +01:00
check_eq ( # Editor_state.lines , 1 , ' F - test_initial_state/#lines ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_initial_state/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_initial_state/cursor:pos ' )
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_initial_state/screen_top:line ' )
check_eq ( Editor_state.screen_top1 . pos , 1 , ' F - test_initial_state/screen_top:pos ' )
2022-06-14 17:26:18 +01:00
end
function test_click_to_create_drawing ( )
io.write ( ' \n test_click_to_create_drawing ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_click ( Editor_state , 8 , Editor_state.top + 8 , 1 )
2022-06-14 17:26:18 +01:00
-- cursor skips drawing to always remain on text
2022-07-12 22:18:50 +01:00
check_eq ( # Editor_state.lines , 2 , ' F - test_click_to_create_drawing/#lines ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_click_to_create_drawing/cursor ' )
2022-06-14 17:26:18 +01:00
end
function test_backspace_to_delete_drawing ( )
io.write ( ' \n test_backspace_to_delete_drawing ' )
-- display a drawing followed by a line of text (you shouldn't ever have a drawing right at the end)
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' ```lines ' , ' ``` ' , ' ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-06-14 17:26:18 +01:00
-- cursor is on text as always (outside tests this will get initialized correctly)
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 . line = 2
2022-06-14 17:26:18 +01:00
-- backspacing deletes the drawing
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( # Editor_state.lines , 1 , ' F - test_backspace_to_delete_drawing/#lines ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_backspace_to_delete_drawing/cursor ' )
2022-06-14 17:26:18 +01:00
end
2022-08-11 06:38:10 +01:00
function test_backspace_from_start_of_final_line ( )
io.write ( ' \n 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 ' )
check_eq ( # Editor_state.lines , 1 , ' F - test_backspace_from_start_of_final_line/#lines ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_backspace_from_start_of_final_line/cursor ' )
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_backspace_from_start_of_final_line/screen_top ' )
end
2022-06-05 17:50:19 +01:00
function test_insert_first_character ( )
io.write ( ' \n test_insert_first_character ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_textinput ( Editor_state , ' a ' )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-05 17:50:19 +01:00
App.screen . check ( y , ' a ' , ' F - test_insert_first_character/screen:1 ' )
end
2022-06-12 18:19:06 +01:00
function test_press_ctrl ( )
io.write ( ' \n test_press_ctrl ' )
-- press ctrl while the cursor is on text
App.screen . init { width = 50 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-m ' )
2022-06-12 18:19:06 +01:00
end
2022-07-12 02:44:09 +01:00
function test_move_left ( )
io.write ( ' \n test_move_left ' )
2022-07-12 23:18:45 +01:00
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' a ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 2 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' left ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_move_left ' )
2022-07-12 02:44:09 +01:00
end
function test_move_right ( )
io.write ( ' \n test_move_right ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' a ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' right ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_move_right ' )
2022-07-12 02:44:09 +01:00
end
function test_move_left_to_previous_line ( )
io.write ( ' \n test_move_left_to_previous_line ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' left ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_move_left_to_previous_line/line ' )
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_move_left_to_previous_line/pos ' ) -- past end of line
2022-07-12 02:44:09 +01:00
end
function test_move_right_to_next_line ( )
io.write ( ' \n test_move_right_to_next_line ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 4 } -- past end of line
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' right ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_move_right_to_next_line/line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_move_right_to_next_line/pos ' )
2022-07-12 02:44:09 +01:00
end
function test_move_to_start_of_word ( )
io.write ( ' \n test_move_to_start_of_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 3 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-left ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_move_to_start_of_word ' )
2022-07-12 02:44:09 +01:00
end
function test_move_to_start_of_previous_word ( )
io.write ( ' \n test_move_to_start_of_previous_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 4 } -- at the space between words
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-left ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_move_to_start_of_previous_word ' )
2022-07-12 02:44:09 +01:00
end
function test_skip_to_previous_word ( )
io.write ( ' \n test_skip_to_previous_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 5 } -- at the start of second word
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-left ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_skip_to_previous_word ' )
2022-07-12 02:44:09 +01:00
end
2022-07-12 02:56:19 +01:00
function test_skip_past_tab_to_previous_word ( )
io.write ( ' \n test_skip_past_tab_to_previous_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def \t ghi ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 10 } -- within third word
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-left ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 9 , ' F - test_skip_past_tab_to_previous_word ' )
2022-07-12 02:56:19 +01:00
end
2022-07-12 03:18:54 +01:00
function test_skip_multiple_spaces_to_previous_word ( )
io.write ( ' \n test_skip_multiple_spaces_to_previous_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 6 } -- at the start of second word
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-left ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_skip_multiple_spaces_to_previous_word ' )
2022-07-12 03:18:54 +01:00
end
2022-07-12 02:44:09 +01:00
function test_move_to_start_of_word_on_previous_line ( )
io.write ( ' \n test_move_to_start_of_word_on_previous_line ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' , ' ghi ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-left ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_move_to_start_of_word_on_previous_line/line ' )
check_eq ( Editor_state.cursor1 . pos , 5 , ' F - test_move_to_start_of_word_on_previous_line/pos ' )
2022-07-12 02:44:09 +01:00
end
function test_move_past_end_of_word ( )
io.write ( ' \n test_move_past_end_of_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-right ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_move_past_end_of_word ' )
2022-07-12 02:44:09 +01:00
end
function test_skip_to_next_word ( )
io.write ( ' \n test_skip_to_next_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 4 } -- at the space between words
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-right ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 8 , ' F - test_skip_to_next_word ' )
2022-07-12 02:44:09 +01:00
end
2022-07-12 02:56:19 +01:00
function test_skip_past_tab_to_next_word ( )
io.write ( ' \n test_skip_past_tab_to_next_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc \t def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 } -- at the space between words
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-right ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_skip_past_tab_to_next_word ' )
2022-07-12 02:56:19 +01:00
end
2022-07-12 03:18:54 +01:00
function test_skip_multiple_spaces_to_next_word ( )
io.write ( ' \n test_skip_multiple_spaces_to_next_word ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 4 } -- at the start of second word
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-right ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 9 , ' F - test_skip_multiple_spaces_to_next_word ' )
2022-07-12 03:18:54 +01:00
end
2022-07-12 02:44:09 +01:00
function test_move_past_end_of_word_on_next_line ( )
io.write ( ' \n test_move_past_end_of_word_on_next_line ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' , ' ghi ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 8 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' M-right ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_move_past_end_of_word_on_next_line/line ' )
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_move_past_end_of_word_on_next_line/pos ' )
2022-07-12 02:44:09 +01:00
end
2022-06-12 18:46:25 +01:00
function test_click_with_mouse ( )
2022-06-14 15:13:52 +01:00
io.write ( ' \n test_click_with_mouse ' )
2022-06-12 18:46:25 +01:00
-- display two lines with cursor on one of them
App.screen . init { width = 50 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-12 18:46:25 +01:00
-- click on the other line
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_click ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
2022-06-12 18:46:25 +01:00
-- cursor moves
2022-07-18 06:15:49 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_click_with_mouse/cursor:line ' )
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , ' F - test_click_with_mouse/selection is empty to avoid perturbing future edits ' )
2022-06-12 18:46:25 +01:00
end
2022-07-29 22:38:45 +01:00
function test_click_with_mouse_to_left_of_line ( )
io.write ( ' \n test_click_with_mouse_to_left_of_line ' )
-- display a line with the cursor in the middle
App.screen . init { width = 50 , 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 = 3 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
-- click to the left of the line
edit.draw ( Editor_state )
edit.run_after_mouse_click ( Editor_state , Editor_state.left - 4 , Editor_state.top + 5 , 1 )
-- cursor moves to start of line
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_click_with_mouse_to_left_of_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_click_with_mouse_to_left_of_line/cursor:pos ' )
check_nil ( Editor_state.selection1 . line , ' F - test_click_with_mouse_to_left_of_line/selection is empty to avoid perturbing future edits ' )
end
2022-07-18 06:15:49 +01:00
function test_click_with_mouse_takes_margins_into_account ( )
io.write ( ' \n test_click_with_mouse_takes_margins_into_account ' )
-- display two lines with cursor on one of them
App.screen . init { width = 100 , height = 80 }
Editor_state = edit.initialize_test_state ( )
Editor_state.left = 50 -- occupy only right side of screen
Editor_state.lines = load_array { ' abc ' , ' def ' }
Text.redraw_all ( Editor_state )
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
-- click on the other line
edit.draw ( Editor_state )
edit.run_after_mouse_click ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
-- cursor moves
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_click_with_mouse_takes_margins_into_account/cursor:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_click_with_mouse_takes_margins_into_account/cursor:pos ' )
2022-07-18 06:15:49 +01:00
check_nil ( Editor_state.selection1 . line , ' F - test_click_with_mouse_takes_margins_into_account/selection is empty to avoid perturbing future edits ' )
end
2022-07-01 20:16:43 +01:00
function test_click_with_mouse_on_empty_line ( )
io.write ( ' \n test_click_with_mouse_on_empty_line ' )
-- display two lines with the first one empty
App.screen . init { width = 50 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' ' , ' def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-01 20:16:43 +01:00
-- click on the empty line
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_click ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
2022-07-01 20:16:43 +01:00
-- cursor moves
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_click_with_mouse_on_empty_line/cursor ' )
2022-07-01 20:16:43 +01:00
end
2022-06-03 22:14:53 +01:00
function test_draw_text ( )
io.write ( ' \n test_draw_text ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_draw_text/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_draw_text/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_draw_text/screen:3 ' )
end
function test_draw_wrapping_text ( )
io.write ( ' \n test_draw_wrapping_text ' )
App.screen . init { width = 50 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' defgh ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_draw_wrapping_text/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' de ' , ' F - test_draw_wrapping_text/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' fgh ' , ' F - test_draw_wrapping_text/screen:3 ' )
2022-06-03 22:14:53 +01:00
end
function test_draw_word_wrapping_text ( )
io.write ( ' \n test_draw_word_wrapping_text ' )
App.screen . init { width = 60 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_draw_word_wrapping_text/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_draw_word_wrapping_text/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_draw_word_wrapping_text/screen:3 ' )
end
2022-07-18 06:15:49 +01:00
function test_click_with_mouse_on_wrapping_line ( )
io.write ( ' \n test_click_with_mouse_on_wrapping_line ' )
-- display two lines with cursor on one of them
App.screen . init { width = 50 , height = 80 }
Editor_state = edit.initialize_test_state ( )
Editor_state.lines = load_array { ' abc def ghi jkl mno pqr stu ' }
Text.redraw_all ( Editor_state )
Editor_state.cursor1 = { line = 1 , pos = 20 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
-- click on the other line
edit.draw ( Editor_state )
edit.run_after_mouse_click ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
-- cursor moves
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_click_with_mouse_on_wrapping_line/cursor:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_click_with_mouse_on_wrapping_line/cursor:pos ' )
2022-07-18 06:15:49 +01:00
check_nil ( Editor_state.selection1 . line , ' F - test_click_with_mouse_on_wrapping_line/selection is empty to avoid perturbing future edits ' )
end
function test_click_with_mouse_on_wrapping_line_takes_margins_into_account ( )
io.write ( ' \n test_click_with_mouse_on_wrapping_line_takes_margins_into_account ' )
-- display two lines with cursor on one of them
App.screen . init { width = 100 , height = 80 }
Editor_state = edit.initialize_test_state ( )
Editor_state.left = 50 -- occupy only right side of screen
Editor_state.lines = load_array { ' abc def ghi jkl mno pqr stu ' }
Text.redraw_all ( Editor_state )
Editor_state.cursor1 = { line = 1 , pos = 20 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
-- click on the other line
edit.draw ( Editor_state )
edit.run_after_mouse_click ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
-- cursor moves
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_click_with_mouse_on_wrapping_line_takes_margins_into_account/cursor:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_click_with_mouse_on_wrapping_line_takes_margins_into_account/cursor:pos ' )
2022-07-18 06:15:49 +01:00
check_nil ( Editor_state.selection1 . line , ' F - test_click_with_mouse_on_wrapping_line_takes_margins_into_account/selection is empty to avoid perturbing future edits ' )
end
2022-06-03 22:14:53 +01:00
function test_draw_text_wrapping_within_word ( )
-- arrange a screen line that needs to be split within a word
io.write ( ' \n test_draw_text_wrapping_within_word ' )
App.screen . init { width = 60 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abcd e fghijk ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abcd ' , ' F - test_draw_text_wrapping_within_word/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' e fgh ' , ' F - test_draw_text_wrapping_within_word/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' ijk ' , ' F - test_draw_text_wrapping_within_word/screen:3 ' )
2022-06-03 22:14:53 +01:00
end
2022-06-14 15:30:47 +01:00
function test_draw_wrapping_text_containing_non_ascii ( )
-- draw a long line containing non-ASCII
io.write ( ' \n test_draw_wrapping_text_containing_non_ascii ' )
App.screen . init { width = 60 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' madam I’ m adam ' , ' xyz ' } -- notice the non-ASCII apostrophe
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' mad ' , ' F - test_draw_wrapping_text_containing_non_ascii/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 15:15:46 +01:00
App.screen . check ( y , ' am I ' , ' F - test_draw_wrapping_text_containing_non_ascii/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 15:15:46 +01:00
App.screen . check ( y , ' ’ m a' , ' F - test_draw_wrapping_text_containing_non_ascii/screen:3 ' )
2022-06-14 15:30:47 +01:00
end
2022-06-29 17:11:23 +01:00
function test_click_on_wrapping_line ( )
io.write ( ' \n test_click_on_wrapping_line ' )
-- display a wrapping line
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-18 05:05:01 +01:00
-- 12345678901234
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { " madam I'm adam " }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-29 17:11:23 +01:00
App.screen . check ( y , ' madam ' , ' F - test_click_on_wrapping_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , " I'm ad " , ' F - test_click_on_wrapping_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 17:11:23 +01:00
-- click past end of second screen line
2022-07-12 23:39:11 +01:00
edit.run_after_mouse_click ( Editor_state , App.screen . width - 2 , y - 2 , 1 )
2022-06-29 17:11:23 +01:00
-- cursor moves to end of screen line
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_click_on_wrapping_line/cursor:line ' )
2022-07-20 00:49:08 +01:00
check_eq ( Editor_state.cursor1 . pos , 12 , ' F - test_click_on_wrapping_line/cursor:pos ' )
2022-06-29 17:11:23 +01:00
end
2022-07-01 02:00:09 +01:00
function test_click_on_wrapping_line_rendered_from_partway_at_top_of_screen ( )
io.write ( ' \n test_click_on_wrapping_line_rendered_from_partway_at_top_of_screen ' )
-- display a wrapping line from its second screen line
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-18 05:05:01 +01:00
-- 12345678901234
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { " madam I'm adam " }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 8 }
Editor_state.screen_top1 = { line = 1 , pos = 7 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-07-20 00:49:08 +01:00
App.screen . check ( y , " I'm ad " , ' F - test_click_on_wrapping_line_rendered_from_partway_at_top_of_screen/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-01 02:00:09 +01:00
-- click past end of second screen line
2022-07-12 23:39:11 +01:00
edit.run_after_mouse_click ( Editor_state , App.screen . width - 2 , y - 2 , 1 )
2022-07-01 02:00:09 +01:00
-- cursor moves to end of screen line
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_click_on_wrapping_line_rendered_from_partway_at_top_of_screen/cursor:line ' )
2022-07-20 00:49:08 +01:00
check_eq ( Editor_state.cursor1 . pos , 12 , ' F - test_click_on_wrapping_line_rendered_from_partway_at_top_of_screen/cursor:pos ' )
2022-07-01 02:00:09 +01:00
end
2022-06-29 17:11:23 +01:00
function test_click_past_end_of_wrapping_line ( )
io.write ( ' \n test_click_past_end_of_wrapping_line ' )
-- display a wrapping line
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-18 05:05:01 +01:00
-- 12345678901234
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { " madam I'm adam " }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-29 17:11:23 +01:00
App.screen . check ( y , ' madam ' , ' F - test_click_past_end_of_wrapping_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , " I'm ad " , ' F - test_click_past_end_of_wrapping_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' am ' , ' F - test_click_past_end_of_wrapping_line/baseline/screen:3 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 17:11:23 +01:00
-- click past the end of it
2022-07-12 23:39:11 +01:00
edit.run_after_mouse_click ( Editor_state , App.screen . width - 2 , y - 2 , 1 )
2022-06-29 17:11:23 +01:00
-- cursor moves to end of line
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 15 , ' F - test_click_past_end_of_wrapping_line/cursor ' ) -- one more than the number of UTF-8 code-points
2022-06-29 17:11:23 +01:00
end
2022-07-20 00:49:08 +01:00
function test_click_past_end_of_wrapping_line_containing_non_ascii ( )
io.write ( ' \n test_click_past_end_of_wrapping_line_containing_non_ascii ' )
2022-06-14 01:23:21 +01:00
-- display a wrapping line containing non-ASCII
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-18 05:05:01 +01:00
-- 12345678901234
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' madam I’ m adam ' } -- notice the non-ASCII apostrophe
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' madam ' , ' F - test_click_past_end_of_wrapping_line_containing_non_ascii/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' I’ m ad ' , ' F - test_click_past_end_of_wrapping_line_containing_non_ascii/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' am ' , ' F - test_click_past_end_of_wrapping_line_containing_non_ascii/baseline/screen:3 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-14 01:23:21 +01:00
-- click past the end of it
2022-07-12 23:39:11 +01:00
edit.run_after_mouse_click ( Editor_state , App.screen . width - 2 , y - 2 , 1 )
2022-06-14 01:23:21 +01:00
-- cursor moves to end of line
2022-07-20 00:49:08 +01:00
check_eq ( Editor_state.cursor1 . pos , 15 , ' F - test_click_past_end_of_wrapping_line_containing_non_ascii/cursor ' ) -- one more than the number of UTF-8 code-points
2022-06-14 01:23:21 +01:00
end
2022-06-29 17:30:23 +01:00
function test_click_past_end_of_word_wrapping_line ( )
io.write ( ' \n test_click_past_end_of_word_wrapping_line ' )
-- display a long line wrapping at a word boundary on a screen of more realistic length
2022-07-01 03:50:27 +01:00
App.screen . init { width = 160 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-18 05:05:01 +01:00
-- 0 1 2
-- 123456789012345678901
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' the quick brown fox jumped over the lazy dog ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-29 17:30:23 +01:00
App.screen . check ( y , ' the quick brown fox ' , ' F - test_click_past_end_of_word_wrapping_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-01 03:50:27 +01:00
-- click past the end of the screen line
2022-07-12 23:39:11 +01:00
edit.run_after_mouse_click ( Editor_state , App.screen . width - 2 , y - 2 , 1 )
2022-06-29 17:30:23 +01:00
-- cursor moves to end of screen line
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . pos , 20 , ' F - test_click_past_end_of_word_wrapping_line/cursor ' )
2022-06-29 17:30:23 +01:00
end
2022-06-20 19:25:00 +01:00
function test_select_text ( )
io.write ( ' \n test_select_text ' )
-- display a line of text
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-20 19:25:00 +01:00
-- select a letter
App.fake_key_press ( ' lshift ' )
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' S-right ' )
2022-06-20 19:25:00 +01:00
App.fake_key_release ( ' lshift ' )
2022-07-16 16:27:11 +01:00
edit.key_released ( Editor_state , ' lshift ' )
2022-06-20 19:25:00 +01:00
-- selection persists even after shift is released
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.selection1 . line , 1 , ' F - test_select_text/selection:line ' )
check_eq ( Editor_state.selection1 . pos , 1 , ' F - test_select_text/selection:pos ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_select_text/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_select_text/cursor:pos ' )
2022-06-20 19:25:00 +01:00
end
2022-06-23 20:05:36 +01:00
function test_cursor_movement_without_shift_resets_selection ( )
io.write ( ' \n test_cursor_movement_without_shift_resets_selection ' )
-- display a line of text with some part selected
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.selection1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-23 20:05:36 +01:00
-- press an arrow key without shift
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' right ' )
2022-06-23 20:05:36 +01:00
-- no change to data, selection is reset
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , ' F - test_cursor_movement_without_shift_resets_selection ' )
check_eq ( Editor_state.lines [ 1 ] . data , ' abc ' , ' F - test_cursor_movement_without_shift_resets_selection/data ' )
2022-06-23 20:05:36 +01:00
end
2022-06-20 18:48:35 +01:00
function test_edit_deletes_selection ( )
io.write ( ' \n test_edit_deletes_selection ' )
-- display a line of text with some part selected
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.selection1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-20 18:48:35 +01:00
-- press a key
2022-07-12 23:39:11 +01:00
edit.run_after_textinput ( Editor_state , ' x ' )
2022-06-20 18:48:35 +01:00
-- selected text is deleted and replaced with the key
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' xbc ' , ' F - test_edit_deletes_selection ' )
2022-06-20 18:48:35 +01:00
end
2022-06-27 01:07:27 +01:00
function test_edit_with_shift_key_deletes_selection ( )
io.write ( ' \n test_edit_with_shift_key_deletes_selection ' )
-- display a line of text with some part selected
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.selection1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-27 01:07:27 +01:00
-- mimic precise keypresses for a capital letter
App.fake_key_press ( ' lshift ' )
2022-07-16 16:27:11 +01:00
edit.keychord_pressed ( Editor_state , ' d ' , ' d ' )
2022-07-16 16:33:05 +01:00
edit.textinput ( Editor_state , ' D ' )
2022-07-16 16:27:11 +01:00
edit.key_released ( Editor_state , ' d ' )
2022-06-27 01:07:27 +01:00
App.fake_key_release ( ' lshift ' )
-- selected text is deleted and replaced with the key
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , ' F - test_edit_with_shift_key_deletes_selection ' )
check_eq ( Editor_state.lines [ 1 ] . data , ' Dbc ' , ' F - test_edit_with_shift_key_deletes_selection/data ' )
2022-06-27 01:07:27 +01:00
end
2022-06-20 20:02:51 +01:00
function test_copy_does_not_reset_selection ( )
io.write ( ' \n test_copy_does_not_reset_selection ' )
-- display a line of text with a selection
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.selection1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-20 20:02:51 +01:00
-- copy selection
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-c ' )
2022-06-20 20:02:51 +01:00
check_eq ( App.clipboard , ' a ' , ' F - test_copy_does_not_reset_selection/clipboard ' )
-- selection is reset since shift key is not pressed
2022-07-12 22:18:50 +01:00
check ( Editor_state.selection1 . line , ' F - test_copy_does_not_reset_selection ' )
2022-06-20 20:02:51 +01:00
end
2022-06-21 17:53:38 +01:00
function test_cut ( )
io.write ( ' \n test_cut ' )
-- display a line of text with some part selected
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.selection1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-21 17:53:38 +01:00
-- press a key
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-x ' )
2022-06-21 17:53:38 +01:00
check_eq ( App.clipboard , ' a ' , ' F - test_cut/clipboard ' )
-- selected text is deleted
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' bc ' , ' F - test_cut/data ' )
2022-06-21 17:53:38 +01:00
end
function test_paste_replaces_selection ( )
io.write ( ' \n test_paste_replaces_selection ' )
-- display a line of text with a selection
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.selection1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-21 17:53:38 +01:00
-- set clipboard
App.clipboard = ' xyz '
-- paste selection
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-v ' )
2022-06-21 17:53:38 +01:00
-- selection is reset since shift key is not pressed
-- selection includes the newline, so it's also deleted
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' xyzdef ' , ' F - test_paste_replaces_selection ' )
2022-06-21 17:53:38 +01:00
end
2022-06-27 00:34:06 +01:00
function test_deleting_selection_may_scroll ( )
io.write ( ' \n test_deleting_selection_may_scroll ' )
-- display lines 2/3/4
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 2 }
Editor_state.screen_top1 = { line = 2 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-27 00:34:06 +01:00
App.screen . check ( y , ' def ' , ' F - test_deleting_selection_may_scroll/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-27 00:34:06 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_deleting_selection_may_scroll/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-27 00:34:06 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_deleting_selection_may_scroll/baseline/screen:3 ' )
-- set up a selection starting above the currently displayed page
2022-07-12 22:18:50 +01:00
Editor_state.selection1 = { line = 1 , pos = 2 }
2022-06-27 00:34:06 +01:00
-- delete selection
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-06-27 00:34:06 +01:00
-- page scrolls up
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_deleting_selection_may_scroll ' )
check_eq ( Editor_state.lines [ 1 ] . data , ' ahi ' , ' F - test_deleting_selection_may_scroll/data ' )
2022-06-27 00:34:06 +01:00
end
2022-06-03 22:14:53 +01:00
function test_edit_wrapping_text ( )
io.write ( ' \n test_edit_wrapping_text ' )
App.screen . init { width = 50 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 4 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_textinput ( Editor_state , ' g ' )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_edit_wrapping_text/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' de ' , ' F - test_edit_wrapping_text/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' fg ' , ' F - test_edit_wrapping_text/screen:3 ' )
2022-06-03 22:14:53 +01:00
end
function test_insert_newline ( )
io.write ( ' \n test_insert_newline ' )
2022-06-05 15:59:44 +01:00
-- display a few lines
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_insert_newline/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_insert_newline/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_insert_newline/baseline/screen:3 ' )
2022-06-05 15:59:44 +01:00
-- hitting the enter key splits the line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' return ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_insert_newline/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_insert_newline/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_insert_newline/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' a ' , ' F - test_insert_newline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' bc ' , ' F - test_insert_newline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_insert_newline/screen:3 ' )
end
2022-06-14 17:26:18 +01:00
function test_insert_newline_at_start_of_line ( )
io.write ( ' \n test_insert_newline_at_start_of_line ' )
-- display a line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-14 17:26:18 +01:00
-- hitting the enter key splits the line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' return ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_insert_newline_at_start_of_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_insert_newline_at_start_of_line/cursor:pos ' )
check_eq ( Editor_state.lines [ 1 ] . data , ' ' , ' F - test_insert_newline_at_start_of_line/data:1 ' )
check_eq ( Editor_state.lines [ 2 ] . data , ' abc ' , ' F - test_insert_newline_at_start_of_line/data:2 ' )
2022-06-14 17:26:18 +01:00
end
2022-06-03 22:14:53 +01:00
function test_insert_from_clipboard ( )
io.write ( ' \n test_insert_from_clipboard ' )
2022-06-05 18:08:28 +01:00
-- display a few lines
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_insert_from_clipboard/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_insert_from_clipboard/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_insert_from_clipboard/baseline/screen:3 ' )
2022-06-05 18:08:28 +01:00
-- paste some text including a newline, check that new line is created
2022-06-03 22:14:53 +01:00
App.clipboard = ' xy \n z '
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-v ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_insert_from_clipboard/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_insert_from_clipboard/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_insert_from_clipboard/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' axy ' , ' F - test_insert_from_clipboard/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' zbc ' , ' F - test_insert_from_clipboard/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_insert_from_clipboard/screen:3 ' )
end
function test_move_cursor_using_mouse ( )
io.write ( ' \n test_move_cursor_using_mouse ' )
App.screen . init { width = 50 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
Editor_state.selection1 = { }
2022-07-28 04:45:46 +01:00
edit.draw ( Editor_state ) -- populate line_cache.starty for each line Editor_state.line_cache
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_release ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_move_cursor_using_mouse/cursor:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_move_cursor_using_mouse/cursor:pos ' )
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , ' F - test_move_cursor_using_mouse/selection:line ' )
check_nil ( Editor_state.selection1 . pos , ' F - test_move_cursor_using_mouse/selection:pos ' )
2022-06-04 22:14:26 +01:00
end
function test_select_text_using_mouse ( )
io.write ( ' \n test_select_text_using_mouse ' )
App.screen . init { width = 50 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
Editor_state.selection1 = { }
2022-07-28 04:45:46 +01:00
edit.draw ( Editor_state ) -- populate line_cache.starty for each line Editor_state.line_cache
2022-06-09 23:09:32 +01:00
-- press and hold on first location
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_press ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
2022-06-09 23:09:32 +01:00
-- drag and release somewhere else
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_release ( Editor_state , Editor_state.left + 20 , Editor_state.top + Editor_state.line_height + 5 , 1 )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.selection1 . line , 1 , ' F - test_select_text_using_mouse/selection:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.selection1 . pos , 2 , ' F - test_select_text_using_mouse/selection:pos ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_select_text_using_mouse/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_select_text_using_mouse/cursor:pos ' )
2022-06-09 23:09:32 +01:00
end
function test_select_text_using_mouse_and_shift ( )
io.write ( ' \n test_select_text_using_mouse_and_shift ' )
App.screen . init { width = 50 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
Editor_state.selection1 = { }
2022-07-28 04:45:46 +01:00
edit.draw ( Editor_state ) -- populate line_cache.starty for each line Editor_state.line_cache
2022-06-04 22:14:26 +01:00
-- click on first location
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_press ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
edit.run_after_mouse_release ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
2022-06-04 22:14:26 +01:00
-- hold down shift and click somewhere else
2022-06-12 16:26:37 +01:00
App.fake_key_press ( ' lshift ' )
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_press ( Editor_state , Editor_state.left + 20 , Editor_state.top + 5 , 1 )
edit.run_after_mouse_release ( Editor_state , Editor_state.left + 20 , Editor_state.top + Editor_state.line_height + 5 , 1 )
2022-06-12 16:26:37 +01:00
App.fake_key_release ( ' lshift ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.selection1 . line , 1 , ' F - test_select_text_using_mouse_and_shift/selection:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.selection1 . pos , 2 , ' F - test_select_text_using_mouse_and_shift/selection:pos ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_select_text_using_mouse_and_shift/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_select_text_using_mouse_and_shift/cursor:pos ' )
2022-06-03 22:14:53 +01:00
end
2022-06-09 23:49:16 +01:00
function test_select_text_repeatedly_using_mouse_and_shift ( )
io.write ( ' \n test_select_text_repeatedly_using_mouse_and_shift ' )
App.screen . init { width = 50 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
Editor_state.selection1 = { }
2022-07-28 04:45:46 +01:00
edit.draw ( Editor_state ) -- populate line_cache.starty for each line Editor_state.line_cache
2022-06-09 23:49:16 +01:00
-- click on first location
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_press ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
edit.run_after_mouse_release ( Editor_state , Editor_state.left + 8 , Editor_state.top + 5 , 1 )
2022-06-09 23:49:16 +01:00
-- hold down shift and click on a second location
2022-06-12 16:26:37 +01:00
App.fake_key_press ( ' lshift ' )
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_press ( Editor_state , Editor_state.left + 20 , Editor_state.top + 5 , 1 )
edit.run_after_mouse_release ( Editor_state , Editor_state.left + 20 , Editor_state.top + Editor_state.line_height + 5 , 1 )
2022-06-09 23:49:16 +01:00
-- hold down shift and click at a third location
2022-06-12 16:26:37 +01:00
App.fake_key_press ( ' lshift ' )
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_press ( Editor_state , Editor_state.left + 20 , Editor_state.top + 5 , 1 )
edit.run_after_mouse_release ( Editor_state , Editor_state.left + 8 , Editor_state.top + Editor_state.line_height + 5 , 1 )
2022-06-12 16:26:37 +01:00
App.fake_key_release ( ' lshift ' )
2022-06-09 23:49:16 +01:00
-- selection is between first and third location. forget the second location, not the first.
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.selection1 . line , 1 , ' F - test_select_text_repeatedly_using_mouse_and_shift/selection:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.selection1 . pos , 2 , ' F - test_select_text_repeatedly_using_mouse_and_shift/selection:pos ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_select_text_repeatedly_using_mouse_and_shift/cursor:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_select_text_repeatedly_using_mouse_and_shift/cursor:pos ' )
2022-06-09 23:49:16 +01:00
end
2022-06-10 02:36:16 +01:00
function test_cut_without_selection ( )
io.write ( ' \n test_cut_without_selection ' )
-- display a few lines
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
Editor_state.selection1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-10 02:36:16 +01:00
-- try to cut without selecting text
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-x ' )
2022-06-10 02:36:16 +01:00
-- no crash
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , ' F - test_cut_without_selection ' )
2022-06-10 02:36:16 +01:00
end
2022-06-03 22:14:53 +01:00
function test_pagedown ( )
io.write ( ' \n test_pagedown ' )
App.screen . init { width = 120 , height = 45 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-03 22:14:53 +01:00
-- initially the first two lines are displayed
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_pagedown/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_pagedown/baseline/screen:2 ' )
-- after pagedown the bottom line becomes the top
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' pagedown ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_pagedown/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_pagedown/cursor ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_pagedown/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pagedown/screen:2 ' )
end
function test_pagedown_skips_drawings ( )
io.write ( ' \n test_pagedown_skips_drawings ' )
-- some lines of text with a drawing intermixed
2022-06-23 05:08:17 +01:00
local drawing_width = 50
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + drawing_width , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , -- height 15
2022-07-18 05:05:01 +01:00
' ```lines ' , ' ``` ' , -- height 25
' def ' , -- height 15
' ghi ' } -- height 15
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 2 ] . mode , ' drawing ' , ' F - test_pagedown_skips_drawings/baseline/lines ' )
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-16 16:48:02 +01:00
local drawing_height = Drawing_padding_height + drawing_width / 2 -- default
2022-06-03 22:14:53 +01:00
-- initially the screen displays the first line and the drawing
-- 15px margin + 15px line1 + 10px margin + 25px drawing + 10px margin = 75px < screen height 80px
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_pagedown_skips_drawings/baseline/screen:1 ' )
-- after pagedown the screen draws the drawing up top
-- 15px margin + 10px margin + 25px drawing + 10px margin + 15px line3 = 75px < screen height 80px
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' pagedown ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_pagedown_skips_drawings/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_pagedown_skips_drawings/cursor ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top + drawing_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_pagedown_skips_drawings/screen:1 ' )
end
2022-06-04 22:55:52 +01:00
function test_pagedown_often_shows_start_of_wrapping_line ( )
io.write ( ' \n test_pagedown_often_shows_start_of_wrapping_line ' )
-- draw a few lines ending in part of a wrapping line
2022-06-03 22:14:53 +01:00
App.screen . init { width = 50 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' abc ' , ' F - test_pagedown_often_shows_start_of_wrapping_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' def ' , ' F - test_pagedown_often_shows_start_of_wrapping_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pagedown_often_shows_start_of_wrapping_line/baseline/screen:3 ' )
-- after pagedown we start drawing from the bottom _line_ (multiple screen lines)
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' pagedown ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_pagedown_often_shows_start_of_wrapping_line/screen_top:line ' )
check_eq ( Editor_state.screen_top1 . pos , 1 , ' F - test_pagedown_often_shows_start_of_wrapping_line/screen_top:pos ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_pagedown_often_shows_start_of_wrapping_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_pagedown_often_shows_start_of_wrapping_line/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' def ' , ' F - test_pagedown_often_shows_start_of_wrapping_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pagedown_often_shows_start_of_wrapping_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_pagedown_often_shows_start_of_wrapping_line/screen:3 ' )
end
function test_pagedown_can_start_from_middle_of_long_wrapping_line ( )
io.write ( ' \n test_pagedown_can_start_from_middle_of_long_wrapping_line ' )
-- draw a few lines starting from a very long wrapping line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ghi jkl mno pqr stu vwx yza bcd efg hij ' , ' XYZ ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' abc ' , ' F - test_pagedown_can_start_from_middle_of_long_wrapping_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' def ' , ' F - test_pagedown_can_start_from_middle_of_long_wrapping_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pagedown_can_start_from_middle_of_long_wrapping_line/baseline/screen:3 ' )
-- after pagedown we scroll down the very long wrapping line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' pagedown ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_pagedown_can_start_from_middle_of_long_wrapping_line/screen_top:line ' )
check_eq ( Editor_state.screen_top1 . pos , 9 , ' F - test_pagedown_can_start_from_middle_of_long_wrapping_line/screen_top:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-04 22:55:52 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pagedown_can_start_from_middle_of_long_wrapping_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 15:08:28 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_pagedown_can_start_from_middle_of_long_wrapping_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 15:08:28 +01:00
App.screen . check ( y , ' mno ' , ' F - test_pagedown_can_start_from_middle_of_long_wrapping_line/screen:3 ' )
2022-06-03 22:14:53 +01:00
end
function test_down_arrow_moves_cursor ( )
io.write ( ' \n test_down_arrow_moves_cursor ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-03 22:14:53 +01:00
-- initially the first three lines are displayed
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_down_arrow_moves_cursor/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_down_arrow_moves_cursor/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_down_arrow_moves_cursor/baseline/screen:3 ' )
-- after hitting the down arrow, the cursor moves down by 1 line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' down ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_down_arrow_moves_cursor/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_down_arrow_moves_cursor/cursor ' )
2022-06-03 22:14:53 +01:00
-- the screen is unchanged
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_down_arrow_moves_cursor/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_down_arrow_moves_cursor/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_down_arrow_moves_cursor/screen:3 ' )
end
function test_down_arrow_scrolls_down_by_one_line ( )
io.write ( ' \n test_down_arrow_scrolls_down_by_one_line ' )
-- display the first three lines with the cursor on the bottom line
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_down_arrow_scrolls_down_by_one_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_down_arrow_scrolls_down_by_one_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_down_arrow_scrolls_down_by_one_line/baseline/screen:3 ' )
-- after hitting the down arrow the screen scrolls down by one line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' down ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_down_arrow_scrolls_down_by_one_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 4 , ' F - test_down_arrow_scrolls_down_by_one_line/cursor ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_down_arrow_scrolls_down_by_one_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_down_arrow_scrolls_down_by_one_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_down_arrow_scrolls_down_by_one_line/screen:3 ' )
end
function test_down_arrow_scrolls_down_by_one_screen_line ( )
io.write ( ' \n test_down_arrow_scrolls_down_by_one_screen_line ' )
-- display the first three lines with the cursor on the bottom line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line/baseline/screen:3 ' ) -- line wrapping includes trailing whitespace
-- after hitting the down arrow the screen scrolls down by one line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' down ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_down_arrow_scrolls_down_by_one_screen_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_down_arrow_scrolls_down_by_one_screen_line/cursor:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.cursor1 . pos , 5 , ' F - test_down_arrow_scrolls_down_by_one_screen_line/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line/screen:3 ' )
end
function test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word ( )
io.write ( ' \n test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word ' )
-- display the first three lines with the cursor on the bottom line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghijkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' ghij ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/baseline/screen:3 ' )
2022-06-03 22:14:53 +01:00
-- after hitting the down arrow the screen scrolls down by one line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' down ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/cursor:line ' )
2022-07-20 00:49:08 +01:00
check_eq ( Editor_state.cursor1 . pos , 5 , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' ghij ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' kl ' , ' F - test_down_arrow_scrolls_down_by_one_screen_line_after_splitting_within_word/screen:3 ' )
2022-06-03 22:14:53 +01:00
end
function test_page_down_followed_by_down_arrow_does_not_scroll_screen_up ( )
io.write ( ' \n test_page_down_followed_by_down_arrow_does_not_scroll_screen_up ' )
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghijkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' ghij ' , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/baseline/screen:3 ' )
2022-06-03 22:14:53 +01:00
-- after hitting pagedown the screen scrolls down to start of a long line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' pagedown ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 3 , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/baseline2/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/baseline2/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/baseline2/cursor:pos ' )
2022-06-03 22:14:53 +01:00
-- after hitting down arrow the screen doesn't scroll down further, and certainly doesn't scroll up
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' down ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 3 , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/cursor:line ' )
2022-07-20 00:49:08 +01:00
check_eq ( Editor_state.cursor1 . pos , 5 , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' ghij ' , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' kl ' , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' mno ' , ' F - test_page_down_followed_by_down_arrow_does_not_scroll_screen_up/screen:3 ' )
end
function test_up_arrow_moves_cursor ( )
io.write ( ' \n test_up_arrow_moves_cursor ' )
-- display the first 3 lines with the cursor on the bottom line
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_up_arrow_moves_cursor/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_up_arrow_moves_cursor/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_up_arrow_moves_cursor/baseline/screen:3 ' )
-- after hitting the up arrow the cursor moves up by 1 line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' up ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_up_arrow_moves_cursor/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_up_arrow_moves_cursor/cursor ' )
2022-06-03 22:14:53 +01:00
-- the screen is unchanged
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_up_arrow_moves_cursor/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_up_arrow_moves_cursor/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_up_arrow_moves_cursor/screen:3 ' )
end
function test_up_arrow_scrolls_up_by_one_line ( )
io.write ( ' \n test_up_arrow_scrolls_up_by_one_line ' )
-- display the lines 2/3/4 with the cursor on line 2
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 2 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_up_arrow_scrolls_up_by_one_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_up_arrow_scrolls_up_by_one_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_up_arrow_scrolls_up_by_one_line/baseline/screen:3 ' )
-- after hitting the up arrow the screen scrolls up by one line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' up ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_up_arrow_scrolls_up_by_one_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_up_arrow_scrolls_up_by_one_line/cursor ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_up_arrow_scrolls_up_by_one_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_up_arrow_scrolls_up_by_one_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_up_arrow_scrolls_up_by_one_line/screen:3 ' )
end
function test_up_arrow_scrolls_up_by_one_screen_line ( )
io.write ( ' \n test_up_arrow_scrolls_up_by_one_screen_line ' )
-- display lines starting from second screen line of a line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 6 }
Editor_state.screen_top1 = { line = 3 , pos = 5 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_up_arrow_scrolls_up_by_one_screen_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' mno ' , ' F - test_up_arrow_scrolls_up_by_one_screen_line/baseline/screen:2 ' )
-- after hitting the up arrow the screen scrolls up to first screen line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' up ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_up_arrow_scrolls_up_by_one_screen_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_up_arrow_scrolls_up_by_one_screen_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' mno ' , ' F - test_up_arrow_scrolls_up_by_one_screen_line/screen:3 ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 3 , ' F - test_up_arrow_scrolls_up_by_one_screen_line/screen_top ' )
check_eq ( Editor_state.screen_top1 . pos , 1 , ' F - test_up_arrow_scrolls_up_by_one_screen_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_up_arrow_scrolls_up_by_one_screen_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_up_arrow_scrolls_up_by_one_screen_line/cursor:pos ' )
2022-06-03 22:14:53 +01:00
end
function test_up_arrow_scrolls_up_to_final_screen_line ( )
io.write ( ' \n test_up_arrow_scrolls_up_to_final_screen_line ' )
-- display lines starting just after a long line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' , ' ghi ' , ' jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 2 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_up_arrow_scrolls_up_to_final_screen_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_up_arrow_scrolls_up_to_final_screen_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' mno ' , ' F - test_up_arrow_scrolls_up_to_final_screen_line/baseline/screen:3 ' )
-- after hitting the up arrow the screen scrolls up to final screen line of previous line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' up ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_up_arrow_scrolls_up_to_final_screen_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_up_arrow_scrolls_up_to_final_screen_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_up_arrow_scrolls_up_to_final_screen_line/screen:3 ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_up_arrow_scrolls_up_to_final_screen_line/screen_top ' )
check_eq ( Editor_state.screen_top1 . pos , 5 , ' F - test_up_arrow_scrolls_up_to_final_screen_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_up_arrow_scrolls_up_to_final_screen_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 5 , ' F - test_up_arrow_scrolls_up_to_final_screen_line/cursor:pos ' )
2022-06-03 22:14:53 +01:00
end
function test_up_arrow_scrolls_up_to_empty_line ( )
io.write ( ' \n test_up_arrow_scrolls_up_to_empty_line ' )
-- display a screenful of text with an empty line just above it outside the screen
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' ' , ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 2 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_up_arrow_scrolls_up_to_empty_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_up_arrow_scrolls_up_to_empty_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_up_arrow_scrolls_up_to_empty_line/baseline/screen:3 ' )
-- after hitting the up arrow the screen scrolls up by one line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' up ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_up_arrow_scrolls_up_to_empty_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_up_arrow_scrolls_up_to_empty_line/cursor ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
-- empty first line
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_up_arrow_scrolls_up_to_empty_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_up_arrow_scrolls_up_to_empty_line/screen:3 ' )
end
function test_pageup ( )
io.write ( ' \n test_pageup ' )
App.screen . init { width = 120 , height = 45 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 2 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-03 22:14:53 +01:00
-- initially the last two lines are displayed
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_pageup/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pageup/baseline/screen:2 ' )
-- after pageup the cursor goes to first line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' pageup ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_pageup/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_pageup/cursor ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_pageup/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_pageup/screen:2 ' )
end
function test_pageup_scrolls_up_by_screen_line ( )
io.write ( ' \n test_pageup_scrolls_up_by_screen_line ' )
-- display the first three lines with the cursor on the bottom line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' , ' ghi ' , ' jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 2 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pageup_scrolls_up_by_screen_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_pageup_scrolls_up_by_screen_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' mno ' , ' F - test_pageup_scrolls_up_by_screen_line/baseline/screen:3 ' ) -- line wrapping includes trailing whitespace
-- after hitting the page-up key the screen scrolls up to top
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' pageup ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_pageup_scrolls_up_by_screen_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_pageup_scrolls_up_by_screen_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_pageup_scrolls_up_by_screen_line/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_pageup_scrolls_up_by_screen_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_pageup_scrolls_up_by_screen_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pageup_scrolls_up_by_screen_line/screen:3 ' )
end
function test_pageup_scrolls_up_from_middle_screen_line ( )
io.write ( ' \n test_pageup_scrolls_up_from_middle_screen_line ' )
2022-07-12 22:18:50 +01:00
-- display a few lines starting from the middle of a line (Editor_state.cursor1.pos > 1)
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ' , ' ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 5 }
Editor_state.screen_top1 = { line = 2 , pos = 5 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_pageup_scrolls_up_from_middle_screen_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' mno ' , ' F - test_pageup_scrolls_up_from_middle_screen_line/baseline/screen:3 ' ) -- line wrapping includes trailing whitespace
-- after hitting the page-up key the screen scrolls up to top
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' pageup ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_pageup_scrolls_up_from_middle_screen_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_pageup_scrolls_up_from_middle_screen_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_pageup_scrolls_up_from_middle_screen_line/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_pageup_scrolls_up_from_middle_screen_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_pageup_scrolls_up_from_middle_screen_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_pageup_scrolls_up_from_middle_screen_line/screen:3 ' )
end
function test_enter_on_bottom_line_scrolls_down ( )
io.write ( ' \n test_enter_on_bottom_line_scrolls_down ' )
-- display a few lines with cursor on bottom line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_enter_on_bottom_line_scrolls_down/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_enter_on_bottom_line_scrolls_down/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_enter_on_bottom_line_scrolls_down/baseline/screen:3 ' )
-- after hitting the enter key the screen scrolls down
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' return ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_enter_on_bottom_line_scrolls_down/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 4 , ' F - test_enter_on_bottom_line_scrolls_down/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_enter_on_bottom_line_scrolls_down/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_enter_on_bottom_line_scrolls_down/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' g ' , ' F - test_enter_on_bottom_line_scrolls_down/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' hi ' , ' F - test_enter_on_bottom_line_scrolls_down/screen:3 ' )
end
function test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom ( )
io.write ( ' \n test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom ' )
-- display just the bottom line on screen
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 4 , pos = 2 }
Editor_state.screen_top1 = { line = 4 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom/baseline/screen:1 ' )
-- after hitting the enter key the screen does not scroll down
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' return ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 4 , ' F - test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 5 , ' F - test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' j ' , ' F - test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' kl ' , ' F - test_enter_on_final_line_avoids_scrolling_down_when_not_at_bottom/screen:2 ' )
end
2022-06-05 18:08:28 +01:00
function test_inserting_text_on_final_line_avoids_scrolling_down_when_not_at_bottom ( )
io.write ( ' \n test_inserting_text_on_final_line_avoids_scrolling_down_when_not_at_bottom ' )
-- display just an empty bottom line on screen
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 2 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-05 18:08:28 +01:00
-- after hitting the inserting_text key the screen does not scroll down
2022-07-12 23:39:11 +01:00
edit.run_after_textinput ( Editor_state , ' a ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_inserting_text_on_final_line_avoids_scrolling_down_when_not_at_bottom/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_inserting_text_on_final_line_avoids_scrolling_down_when_not_at_bottom/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 2 , ' F - test_inserting_text_on_final_line_avoids_scrolling_down_when_not_at_bottom/cursor:pos ' )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-05 18:08:28 +01:00
App.screen . check ( y , ' a ' , ' F - test_inserting_text_on_final_line_avoids_scrolling_down_when_not_at_bottom/screen:1 ' )
end
2022-06-05 16:29:38 +01:00
function test_typing_on_bottom_line_scrolls_down ( )
io.write ( ' \n test_typing_on_bottom_line_scrolls_down ' )
-- display a few lines with cursor on bottom line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 4 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-05 16:29:38 +01:00
App.screen . check ( y , ' abc ' , ' F - test_typing_on_bottom_line_scrolls_down/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-05 16:29:38 +01:00
App.screen . check ( y , ' def ' , ' F - test_typing_on_bottom_line_scrolls_down/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-05 16:29:38 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_typing_on_bottom_line_scrolls_down/baseline/screen:3 ' )
-- after typing something the line wraps and the screen scrolls down
2022-07-12 23:39:11 +01:00
edit.run_after_textinput ( Editor_state , ' j ' )
edit.run_after_textinput ( Editor_state , ' k ' )
edit.run_after_textinput ( Editor_state , ' l ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_typing_on_bottom_line_scrolls_down/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_typing_on_bottom_line_scrolls_down/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 7 , ' F - test_typing_on_bottom_line_scrolls_down/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-05 16:29:38 +01:00
App.screen . check ( y , ' def ' , ' F - test_typing_on_bottom_line_scrolls_down/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' ghij ' , ' F - test_typing_on_bottom_line_scrolls_down/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' kl ' , ' F - test_typing_on_bottom_line_scrolls_down/screen:3 ' )
2022-06-05 16:29:38 +01:00
end
2022-06-29 02:48:59 +01:00
function test_left_arrow_scrolls_up_in_wrapped_line ( )
io.write ( ' \n test_left_arrow_scrolls_up_in_wrapped_line ' )
-- display lines starting from second screen line of a line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.screen_top1 = { line = 3 , pos = 5 }
Editor_state.screen_bottom1 = { }
2022-06-29 02:48:59 +01:00
-- cursor is at top of screen
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 5 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_left_arrow_scrolls_up_in_wrapped_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' mno ' , ' F - test_left_arrow_scrolls_up_in_wrapped_line/baseline/screen:2 ' )
-- after hitting the left arrow the screen scrolls up to first screen line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' left ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_left_arrow_scrolls_up_in_wrapped_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_left_arrow_scrolls_up_in_wrapped_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' mno ' , ' F - test_left_arrow_scrolls_up_in_wrapped_line/screen:3 ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 3 , ' F - test_left_arrow_scrolls_up_in_wrapped_line/screen_top ' )
check_eq ( Editor_state.screen_top1 . pos , 1 , ' F - test_left_arrow_scrolls_up_in_wrapped_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_left_arrow_scrolls_up_in_wrapped_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_left_arrow_scrolls_up_in_wrapped_line/cursor:pos ' )
2022-06-29 02:48:59 +01:00
end
function test_right_arrow_scrolls_down_in_wrapped_line ( )
io.write ( ' \n test_right_arrow_scrolls_down_in_wrapped_line ' )
-- display the first three lines with the cursor on the bottom line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-29 02:48:59 +01:00
-- cursor is at bottom right of screen
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 5 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' abc ' , ' F - test_right_arrow_scrolls_down_in_wrapped_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' def ' , ' F - test_right_arrow_scrolls_down_in_wrapped_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_right_arrow_scrolls_down_in_wrapped_line/baseline/screen:3 ' ) -- line wrapping includes trailing whitespace
-- after hitting the right arrow the screen scrolls down by one line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' right ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_right_arrow_scrolls_down_in_wrapped_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_right_arrow_scrolls_down_in_wrapped_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 6 , ' F - test_right_arrow_scrolls_down_in_wrapped_line/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' def ' , ' F - test_right_arrow_scrolls_down_in_wrapped_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_right_arrow_scrolls_down_in_wrapped_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_right_arrow_scrolls_down_in_wrapped_line/screen:3 ' )
end
function test_home_scrolls_up_in_wrapped_line ( )
io.write ( ' \n test_home_scrolls_up_in_wrapped_line ' )
-- display lines starting from second screen line of a line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.screen_top1 = { line = 3 , pos = 5 }
Editor_state.screen_bottom1 = { }
2022-06-29 02:48:59 +01:00
-- cursor is at top of screen
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 5 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_home_scrolls_up_in_wrapped_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' mno ' , ' F - test_home_scrolls_up_in_wrapped_line/baseline/screen:2 ' )
-- after hitting home the screen scrolls up to first screen line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' home ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_home_scrolls_up_in_wrapped_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_home_scrolls_up_in_wrapped_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' mno ' , ' F - test_home_scrolls_up_in_wrapped_line/screen:3 ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 3 , ' F - test_home_scrolls_up_in_wrapped_line/screen_top ' )
check_eq ( Editor_state.screen_top1 . pos , 1 , ' F - test_home_scrolls_up_in_wrapped_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_home_scrolls_up_in_wrapped_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_home_scrolls_up_in_wrapped_line/cursor:pos ' )
2022-06-29 02:48:59 +01:00
end
function test_end_scrolls_down_in_wrapped_line ( )
io.write ( ' \n test_end_scrolls_down_in_wrapped_line ' )
-- display the first three lines with the cursor on the bottom line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-29 02:48:59 +01:00
-- cursor is at bottom right of screen
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 5 }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' abc ' , ' F - test_end_scrolls_down_in_wrapped_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' def ' , ' F - test_end_scrolls_down_in_wrapped_line/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_end_scrolls_down_in_wrapped_line/baseline/screen:3 ' ) -- line wrapping includes trailing whitespace
-- after hitting end the screen scrolls down by one line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' end ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 2 , ' F - test_end_scrolls_down_in_wrapped_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_end_scrolls_down_in_wrapped_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 8 , ' F - test_end_scrolls_down_in_wrapped_line/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' def ' , ' F - test_end_scrolls_down_in_wrapped_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_end_scrolls_down_in_wrapped_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-29 02:48:59 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_end_scrolls_down_in_wrapped_line/screen:3 ' )
end
2022-06-03 22:14:53 +01:00
function test_position_cursor_on_recently_edited_wrapping_line ( )
-- draw a line wrapping over 2 screen lines
io.write ( ' \n test_position_cursor_on_recently_edited_wrapping_line ' )
2022-07-01 03:50:27 +01:00
App.screen . init { width = 100 , height = 200 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc def ghi jkl mno pqr ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 25 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc def ghi ' , ' F - test_position_cursor_on_recently_edited_wrapping_line/baseline1/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl mno pqr ' , ' F - test_position_cursor_on_recently_edited_wrapping_line/baseline1/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' xyz ' , ' F - test_position_cursor_on_recently_edited_wrapping_line/baseline1/screen:3 ' )
-- add to the line until it's wrapping over 3 screen lines
2022-07-12 23:39:11 +01:00
edit.run_after_textinput ( Editor_state , ' s ' )
edit.run_after_textinput ( Editor_state , ' t ' )
edit.run_after_textinput ( Editor_state , ' u ' )
2022-07-20 01:13:16 +01:00
check_eq ( Editor_state.cursor1 . pos , 28 , ' F - test_position_cursor_on_recently_edited_wrapping_line/cursor:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc def ghi ' , ' F - test_position_cursor_on_recently_edited_wrapping_line/baseline2/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl mno pqr ' , ' F - test_position_cursor_on_recently_edited_wrapping_line/baseline2/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' stu ' , ' F - test_position_cursor_on_recently_edited_wrapping_line/baseline2/screen:3 ' )
-- try to move the cursor earlier in the third screen line by clicking the mouse
2022-07-13 02:29:00 +01:00
edit.run_after_mouse_release ( Editor_state , Editor_state.left + 8 , Editor_state.top + Editor_state.line_height * 2 + 5 , 1 )
2022-06-03 22:14:53 +01:00
-- cursor should move
2022-07-20 01:13:16 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_position_cursor_on_recently_edited_wrapping_line/cursor:line ' )
2022-07-20 17:11:29 +01:00
check_eq ( Editor_state.cursor1 . pos , 26 , ' F - test_position_cursor_on_recently_edited_wrapping_line/cursor:pos ' )
2022-06-03 22:14:53 +01:00
end
function test_backspace_can_scroll_up ( )
io.write ( ' \n test_backspace_can_scroll_up ' )
-- display the lines 2/3/4 with the cursor on line 2
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.screen_top1 = { line = 2 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_backspace_can_scroll_up/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_backspace_can_scroll_up/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_backspace_can_scroll_up/baseline/screen:3 ' )
-- after hitting backspace the screen scrolls up by one line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 1 , ' F - test_backspace_can_scroll_up/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 1 , ' F - test_backspace_can_scroll_up/cursor ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abcdef ' , ' F - test_backspace_can_scroll_up/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' ghi ' , ' F - test_backspace_can_scroll_up/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_backspace_can_scroll_up/screen:3 ' )
end
function test_backspace_can_scroll_up_screen_line ( )
io.write ( ' \n test_backspace_can_scroll_up_screen_line ' )
-- display lines starting from second screen line of a line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 3 , pos = 5 }
Editor_state.screen_top1 = { line = 3 , pos = 5 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' jkl ' , ' F - test_backspace_can_scroll_up_screen_line/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' mno ' , ' F - test_backspace_can_scroll_up_screen_line/baseline/screen:2 ' )
-- after hitting backspace the screen scrolls up by one screen line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' ghij ' , ' F - test_backspace_can_scroll_up_screen_line/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-07-20 00:49:08 +01:00
App.screen . check ( y , ' kl ' , ' F - test_backspace_can_scroll_up_screen_line/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' mno ' , ' F - test_backspace_can_scroll_up_screen_line/screen:3 ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.screen_top1 . line , 3 , ' F - test_backspace_can_scroll_up_screen_line/screen_top ' )
check_eq ( Editor_state.screen_top1 . pos , 1 , ' F - test_backspace_can_scroll_up_screen_line/screen_top ' )
check_eq ( Editor_state.cursor1 . line , 3 , ' F - test_backspace_can_scroll_up_screen_line/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_backspace_can_scroll_up_screen_line/cursor:pos ' )
2022-06-03 22:14:53 +01:00
end
2022-06-14 17:26:18 +01:00
function test_backspace_past_line_boundary ( )
io.write ( ' \n test_backspace_past_line_boundary ' )
-- position cursor at start of a (non-first) line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
2022-06-14 17:26:18 +01:00
-- backspace joins with previous line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' abcdef ' , " F - test_backspace_past_line_boundary " )
2022-06-14 17:26:18 +01:00
end
2022-06-03 22:14:53 +01:00
-- 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 ( )
io.write ( ' \n test_backspace_over_selection ' )
-- select just one character within a line with cursor before selection
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.selection1 = { line = 1 , pos = 2 }
2022-06-03 22:14:53 +01:00
-- backspace deletes the selected character, even though it's after the cursor
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' bc ' , " F - test_backspace_over_selection/data " )
2022-06-03 22:14:53 +01:00
-- cursor (remains) at start of selection
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , " F - test_backspace_over_selection/cursor:line " )
check_eq ( Editor_state.cursor1 . pos , 1 , " F - test_backspace_over_selection/cursor:pos " )
2022-06-03 22:14:53 +01:00
-- selection is cleared
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , " F - test_backspace_over_selection/selection " )
2022-06-03 22:14:53 +01:00
end
function test_backspace_over_selection_reverse ( )
io.write ( ' \n test_backspace_over_selection_reverse ' )
-- select just one character within a line with cursor after selection
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 2 }
Editor_state.selection1 = { line = 1 , pos = 1 }
2022-06-03 22:14:53 +01:00
-- backspace deletes the selected character
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' bc ' , " F - test_backspace_over_selection_reverse/data " )
2022-06-03 22:14:53 +01:00
-- cursor moves to start of selection
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , " F - test_backspace_over_selection_reverse/cursor:line " )
check_eq ( Editor_state.cursor1 . pos , 1 , " F - test_backspace_over_selection_reverse/cursor:pos " )
2022-06-03 22:14:53 +01:00
-- selection is cleared
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , " F - test_backspace_over_selection_reverse/selection " )
2022-06-03 22:14:53 +01:00
end
function test_backspace_over_multiple_lines ( )
io.write ( ' \n test_backspace_over_multiple_lines ' )
-- select just one character within a line with cursor after selection
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 2 }
Editor_state.selection1 = { line = 4 , pos = 2 }
2022-06-03 22:14:53 +01:00
-- backspace deletes the region and joins the remaining portions of lines on either side
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' akl ' , " F - test_backspace_over_multiple_lines/data:1 " )
check_eq ( Editor_state.lines [ 2 ] . data , ' mno ' , " F - test_backspace_over_multiple_lines/data:2 " )
2022-06-03 22:14:53 +01:00
-- cursor remains at start of selection
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , " F - test_backspace_over_multiple_lines/cursor:line " )
check_eq ( Editor_state.cursor1 . pos , 2 , " F - test_backspace_over_multiple_lines/cursor:pos " )
2022-06-03 22:14:53 +01:00
-- selection is cleared
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , " F - test_backspace_over_multiple_lines/selection " )
2022-06-03 22:14:53 +01:00
end
function test_backspace_to_end_of_line ( )
io.write ( ' \n test_backspace_to_end_of_line ' )
-- select region from cursor to end of line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 2 }
Editor_state.selection1 = { line = 1 , pos = 4 }
2022-06-03 22:14:53 +01:00
-- backspace deletes rest of line without joining to any other line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' a ' , " F - test_backspace_to_start_of_line/data:1 " )
check_eq ( Editor_state.lines [ 2 ] . data , ' def ' , " F - test_backspace_to_start_of_line/data:2 " )
2022-06-03 22:14:53 +01:00
-- cursor remains at start of selection
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 1 , " F - test_backspace_to_start_of_line/cursor:line " )
check_eq ( Editor_state.cursor1 . pos , 2 , " F - test_backspace_to_start_of_line/cursor:pos " )
2022-06-03 22:14:53 +01:00
-- selection is cleared
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , " F - test_backspace_to_start_of_line/selection " )
2022-06-03 22:14:53 +01:00
end
function test_backspace_to_start_of_line ( )
io.write ( ' \n test_backspace_to_start_of_line ' )
-- select region from cursor to start of line
2022-07-13 02:29:00 +01:00
App.screen . init { width = Editor_state.left + 30 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' ghi ' , ' jkl ' , ' mno ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 1 }
Editor_state.selection1 = { line = 2 , pos = 3 }
2022-06-03 22:14:53 +01:00
-- backspace deletes beginning of line without joining to any other line
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' abc ' , " F - test_backspace_to_start_of_line/data:1 " )
check_eq ( Editor_state.lines [ 2 ] . data , ' f ' , " F - test_backspace_to_start_of_line/data:2 " )
2022-06-03 22:14:53 +01:00
-- cursor remains at start of selection
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , " F - test_backspace_to_start_of_line/cursor:line " )
check_eq ( Editor_state.cursor1 . pos , 1 , " F - test_backspace_to_start_of_line/cursor:pos " )
2022-06-03 22:14:53 +01:00
-- selection is cleared
2022-07-12 22:18:50 +01:00
check_nil ( Editor_state.selection1 . line , " F - test_backspace_to_start_of_line/selection " )
2022-06-03 22:14:53 +01:00
end
function test_undo_insert_text ( )
io.write ( ' \n test_undo_insert_text ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' def ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 4 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-03 22:14:53 +01:00
-- insert a character
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-07-12 23:39:11 +01:00
edit.run_after_textinput ( Editor_state , ' g ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_undo_insert_text/baseline/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 5 , ' F - test_undo_insert_text/baseline/cursor:pos ' )
check_nil ( Editor_state.selection1 . line , ' F - test_undo_insert_text/baseline/selection:line ' )
check_nil ( Editor_state.selection1 . pos , ' F - test_undo_insert_text/baseline/selection:pos ' )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_undo_insert_text/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' defg ' , ' F - test_undo_insert_text/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' xyz ' , ' F - test_undo_insert_text/baseline/screen:3 ' )
-- undo
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-z ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_undo_insert_text/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_undo_insert_text/cursor:pos ' )
check_nil ( Editor_state.selection1 . line , ' F - test_undo_insert_text/selection:line ' )
check_nil ( Editor_state.selection1 . pos , ' F - test_undo_insert_text/selection:pos ' )
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_undo_insert_text/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_undo_insert_text/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' xyz ' , ' F - test_undo_insert_text/screen:3 ' )
end
function test_undo_delete_text ( )
io.write ( ' \n test_undo_delete_text ' )
App.screen . init { width = 120 , height = 60 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' , ' defg ' , ' xyz ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 2 , pos = 5 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-06-03 22:14:53 +01:00
-- delete a character
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' backspace ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_undo_delete_text/baseline/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 4 , ' F - test_undo_delete_text/baseline/cursor:pos ' )
check_nil ( Editor_state.selection1 . line , ' F - test_undo_delete_text/baseline/selection:line ' )
check_nil ( Editor_state.selection1 . pos , ' F - test_undo_delete_text/baseline/selection:pos ' )
2022-07-13 02:29:00 +01:00
local y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_undo_delete_text/baseline/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' def ' , ' F - test_undo_delete_text/baseline/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' xyz ' , ' F - test_undo_delete_text/baseline/screen:3 ' )
-- undo
--? -- after undo, the backspaced key is selected
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-z ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_undo_delete_text/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 5 , ' F - test_undo_delete_text/cursor:pos ' )
check_nil ( Editor_state.selection1 . line , ' F - test_undo_delete_text/selection:line ' )
check_nil ( Editor_state.selection1 . pos , ' F - test_undo_delete_text/selection:pos ' )
--? check_eq(Editor_state.selection1.line, 2, 'F - test_undo_delete_text/selection:line')
--? check_eq(Editor_state.selection1.pos, 4, 'F - test_undo_delete_text/selection:pos')
2022-07-13 02:29:00 +01:00
y = Editor_state.top
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' abc ' , ' F - test_undo_delete_text/screen:1 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' defg ' , ' F - test_undo_delete_text/screen:2 ' )
2022-07-12 22:18:50 +01:00
y = y + Editor_state.line_height
2022-06-03 22:14:53 +01:00
App.screen . check ( y , ' xyz ' , ' F - test_undo_delete_text/screen:3 ' )
end
2022-06-20 20:06:44 +01:00
function test_undo_restores_selection ( )
io.write ( ' \n test_undo_restores_selection ' )
-- display a line of text with some part selected
2022-07-01 03:50:27 +01:00
App.screen . init { width = 75 , height = 80 }
2022-07-16 06:12:25 +01:00
Editor_state = edit.initialize_test_state ( )
2022-07-12 22:18:50 +01:00
Editor_state.lines = load_array { ' abc ' }
2022-07-18 05:05:01 +01:00
Text.redraw_all ( Editor_state )
2022-07-12 22:18:50 +01:00
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.selection1 = { line = 1 , pos = 2 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
2022-07-12 23:18:45 +01:00
edit.draw ( Editor_state )
2022-06-20 20:06:44 +01:00
-- delete selected text
2022-07-12 23:39:11 +01:00
edit.run_after_textinput ( Editor_state , ' x ' )
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.lines [ 1 ] . data , ' xbc ' , ' F - test_undo_restores_selection/baseline ' )
check_nil ( Editor_state.selection1 . line , ' F - test_undo_restores_selection/baseline:selection ' )
2022-06-20 20:06:44 +01:00
-- undo
2022-07-12 23:39:11 +01:00
edit.run_after_keychord ( Editor_state , ' C-z ' )
edit.run_after_keychord ( Editor_state , ' C-z ' )
2022-06-20 20:06:44 +01:00
-- selection is restored
2022-07-12 22:18:50 +01:00
check_eq ( Editor_state.selection1 . line , 1 , ' F - test_undo_restores_selection/line ' )
check_eq ( Editor_state.selection1 . pos , 2 , ' F - test_undo_restores_selection/pos ' )
2022-06-20 20:06:44 +01:00
end
2022-07-22 00:53:54 +01:00
function test_search ( )
io.write ( ' \n test_search ' )
App.screen . init { width = 120 , height = 60 }
Editor_state = edit.initialize_test_state ( )
2022-07-25 17:49:26 +01:00
Editor_state.lines = load_array { ' ```lines ' , ' ``` ' , ' def ' , ' ghi ' , ' deg ' }
2022-07-22 00:53:54 +01:00
Text.redraw_all ( Editor_state )
Editor_state.cursor1 = { line = 1 , pos = 1 }
Editor_state.screen_top1 = { line = 1 , pos = 1 }
Editor_state.screen_bottom1 = { }
edit.draw ( Editor_state )
-- search for a string
edit.run_after_keychord ( Editor_state , ' C-f ' )
edit.run_after_textinput ( Editor_state , ' d ' )
edit.run_after_keychord ( Editor_state , ' return ' )
check_eq ( Editor_state.cursor1 . line , 2 , ' F - test_search/1/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_search/1/cursor:pos ' )
-- reset cursor
Editor_state.cursor1 = { line = 1 , pos = 1 }
2022-07-25 17:49:26 +01:00
Editor_state.screen_top1 = { line = 1 , pos = 1 }
2022-07-22 00:53:54 +01:00
-- search for second occurrence
edit.run_after_keychord ( Editor_state , ' C-f ' )
edit.run_after_textinput ( Editor_state , ' de ' )
edit.run_after_keychord ( Editor_state , ' down ' )
edit.run_after_keychord ( Editor_state , ' return ' )
check_eq ( Editor_state.cursor1 . line , 4 , ' F - test_search/2/cursor:line ' )
check_eq ( Editor_state.cursor1 . pos , 1 , ' F - test_search/2/cursor:pos ' )
end