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