# HG changeset patch # User Bram Moolenaar # Date 1643566503 -3600 # Node ID f0096e5b3df9379ef64226cbcbd7d2a5d8ad77eb # Parent 278bf9ba58b839d7d1690d2804918a72aa6264b9 patch 8.2.4263: no test for the GUI find/replace dialog Commit: https://github.com/vim/vim/commit/ec3637cbaf23730b6efe5e5c0047e23adc82160b Author: Yegappan Lakshmanan Date: Sun Jan 30 18:01:24 2022 +0000 patch 8.2.4263: no test for the GUI find/replace dialog Problem: No test for the GUI find/replace dialog. Solution: Add a test function and a test. (Yegappan Lakshmanan, closes #9662) diff --git a/runtime/doc/testing.txt b/runtime/doc/testing.txt --- a/runtime/doc/testing.txt +++ b/runtime/doc/testing.txt @@ -85,10 +85,12 @@ test_getvalue({name}) *test_getvalue *test_gui_event()* test_gui_event({event}, {args}) Generate a GUI {event} with arguments {args} for testing Vim - functionality. + functionality. This function works only when the GUI is + running. {event} is a String and the supported values are: "dropfiles" drop one or more files in a window. + "findrepl" search and replace text "mouse" mouse button click event. "tabline" select a tab page by mouse click. "tabmenu" select a tabline menu entry. @@ -107,12 +109,27 @@ test_gui_event({event}, {args}) 0x10 Ctrl The files are added to the |argument-list| and the first file in {files} is edited in the window. See |drag-n-drop| - for more information. This function only works when the GUI - is running and the |drop_file| feature is present. + for more information. This event works only when the + |drop_file| feature is present. + + "findrepl": + Perform a search and replace of text. The supported items + in {args} are: + find_text: string to find. + repl_text: replacement string + flags: flags controlling the find/replace. Supported + values are: + 1 search next string (find dialog) + 2 search next string (replace dialog) + 3 replace string once + 4 replace all matches + 8 match whole words only + 16 match case + forward: set to 1 for forward search. "mouse": - Inject a mouse button click event. This function only works - when the GUI is running. The supported items in {args} are: + Inject a mouse button click event. The supported items in + {args} are: button: mouse button. The supported values are: 0 right mouse button 1 middle mouse button diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim --- a/src/testdir/test_gui.vim +++ b/src/testdir/test_gui.vim @@ -1255,10 +1255,6 @@ endfunc func Test_gui_drop_files() CheckFeature drop_file - call assert_false(test_gui_event("dropfiles", {})) - let d = #{row: 1, col: 1, modifiers: 0} - call assert_false(test_gui_event("dropfiles", d)) - %bw! %argdelete let d = #{files: [], row: 1, col: 1, modifiers: 0} @@ -1345,6 +1341,15 @@ func Test_gui_drop_files() call feedkeys('k', 'Lx!') call assert_equal('"a.c b.c', @:) cunmap + + " Invalid arguments + call assert_false(test_gui_event("dropfiles", {})) + let d = #{row: 1, col: 1, modifiers: 0} + call assert_false(test_gui_event("dropfiles", d)) + let d = #{files: test_null_list(), row: 1, col: 1, modifiers: 0} + call assert_false(test_gui_event("dropfiles", d)) + let d = #{files: [test_null_string()], row: 1, col: 1, modifiers: 0} + call assert_true(test_gui_event("dropfiles", d)) endfunc " Test for generating a GUI tabline event to select a tab page @@ -1367,6 +1372,10 @@ func Test_gui_tabline_event() call feedkeys("q::let t = test_gui_event('tabline', #{tabnr: 2})\:q\", 'x!') call assert_equal(v:false, t) + " Invalid arguments + call assert_false(test_gui_event('tabline', {})) + call assert_false(test_gui_event('tabline', #{abc: 1})) + %bw! endfunc @@ -1397,7 +1406,61 @@ func Test_gui_tabmenu_event() call feedkeys("y", "Lx!") call assert_equal(2, tabpagenr('$')) + " Invalid arguments + call assert_false(test_gui_event('tabmenu', {})) + call assert_false(test_gui_event('tabmenu', #{tabnr: 1})) + call assert_false(test_gui_event('tabmenu', #{item: 1})) + call assert_false(test_gui_event('tabmenu', #{abc: 1})) + %bw! endfunc +" Test for find/replace text dialog event +func Test_gui_findrepl() + new + call setline(1, ['one two one', 'Twoo One two oneo']) + + " Replace all instances of a string with another + let args = #{find_text: 'one', repl_text: 'ONE', flags: 0x4, forward: 1} + call test_gui_event('findrepl', args) + call assert_equal(['ONE two ONE', 'Twoo ONE two ONEo'], getline(1, '$')) + + " Replace all instances of a whole string with another + call cursor(1, 1) + let args = #{find_text: 'two', repl_text: 'TWO', flags: 0xC, forward: 1} + call test_gui_event('findrepl', args) + call assert_equal(['ONE TWO ONE', 'Twoo ONE TWO ONEo'], getline(1, '$')) + + " Find next occurance of a string (in a find dialog) + call cursor(1, 11) + let args = #{find_text: 'TWO', repl_text: '', flags: 0x11, forward: 1} + call test_gui_event('findrepl', args) + call assert_equal([2, 10], [line('.'), col('.')]) + + " Find previous occurances of a string (in a find dialog) + call cursor(1, 11) + let args = #{find_text: 'TWO', repl_text: '', flags: 0x11, forward: 0} + call test_gui_event('findrepl', args) + call assert_equal([1, 5], [line('.'), col('.')]) + + " Find next occurance of a string (in a replace dialog) + call cursor(1, 1) + let args = #{find_text: 'Twoo', repl_text: '', flags: 0x2, forward: 1} + call test_gui_event('findrepl', args) + call assert_equal([2, 1], [line('.'), col('.')]) + + " Replace only the next occurance of a string (once) + call cursor(1, 5) + let args = #{find_text: 'TWO', repl_text: 'two', flags: 0x3, forward: 1} + call test_gui_event('findrepl', args) + call assert_equal(['ONE two ONE', 'Twoo ONE TWO ONEo'], getline(1, '$')) + + " Replace all instances of a whole string with another matching case + call cursor(1, 1) + let args = #{find_text: 'TWO', repl_text: 'two', flags: 0x1C, forward: 1} + call test_gui_event('findrepl', args) + call assert_equal(['ONE two ONE', 'Twoo ONE two ONEo'], getline(1, '$')) + bw! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/testing.c b/src/testing.c --- a/src/testing.c +++ b/src/testing.c @@ -1319,7 +1319,7 @@ f_test_setmouse(typval_T *argvars, typva static int test_gui_drop_files(dict_T *args UNUSED) { -#if defined(HAVE_DROP_FILE) +# if defined(HAVE_DROP_FILE) int row; int col; int_u mods; @@ -1335,16 +1335,15 @@ test_gui_drop_files(dict_T *args UNUSED) || dict_find(args, (char_u *)"modifiers", -1) == NULL) return FALSE; - if (dict_get_tv(args, (char_u *)"files", &t) == FAIL) - return FALSE; + (void)dict_get_tv(args, (char_u *)"files", &t); row = (int)dict_get_number(args, (char_u *)"row"); col = (int)dict_get_number(args, (char_u *)"col"); mods = (int)dict_get_number(args, (char_u *)"modifiers"); - l = t.vval.v_list; - if (list_len(l) == 0) + if (t.v_type != VAR_LIST || list_len(t.vval.v_list) == 0) return FALSE; + l = t.vval.v_list; fnames = ALLOC_MULT(char_u *, list_len(l)); if (fnames == NULL) return FALSE; @@ -1352,7 +1351,8 @@ test_gui_drop_files(dict_T *args UNUSED) FOR_ALL_LIST_ITEMS(l, li) { // ignore non-string items - if (li->li_tv.v_type != VAR_STRING) + if (li->li_tv.v_type != VAR_STRING + || li->li_tv.vval.v_string == NULL) continue; fnames[count] = vim_strsave(li->li_tv.vval.v_string); @@ -1370,13 +1370,40 @@ test_gui_drop_files(dict_T *args UNUSED) gui_handle_drop(TEXT_X(col - 1), TEXT_Y(row - 1), mods, fnames, count); else vim_free(fnames); -# endif +# endif return TRUE; } static int -test_gui_mouse_event(dict_T *args UNUSED) +test_gui_find_repl(dict_T *args) +{ + int flags; + char_u *find_text; + char_u *repl_text; + int forward; + int retval; + + if (dict_find(args, (char_u *)"find_text", -1) == NULL + || dict_find(args, (char_u *)"repl_text", -1) == NULL + || dict_find(args, (char_u *)"flags", -1) == NULL + || dict_find(args, (char_u *)"forward", -1) == NULL) + return FALSE; + + find_text = dict_get_string(args, (char_u *)"find_text", TRUE); + repl_text = dict_get_string(args, (char_u *)"repl_text", TRUE); + flags = (int)dict_get_number(args, (char_u *)"flags"); + forward = (int)dict_get_number(args, (char_u *)"forward"); + + retval = gui_do_findrepl(flags, find_text, repl_text, forward); + vim_free(find_text); + vim_free(repl_text); + + return retval; +} + + static int +test_gui_mouse_event(dict_T *args) { int button; int row; @@ -1405,7 +1432,7 @@ test_gui_mouse_event(dict_T *args UNUSED static int test_gui_tabline_event(dict_T *args UNUSED) { -# ifdef FEAT_GUI_TABLINE +# ifdef FEAT_GUI_TABLINE int tabnr; if (dict_find(args, (char_u *)"tabnr", -1) == NULL) @@ -1414,15 +1441,15 @@ test_gui_tabline_event(dict_T *args UNUS tabnr = (int)dict_get_number(args, (char_u *)"tabnr"); return send_tabline_event(tabnr); -# else +# else return FALSE; -# endif +# endif } static int test_gui_tabmenu_event(dict_T *args UNUSED) { -# ifdef FEAT_GUI_TABLINE +# ifdef FEAT_GUI_TABLINE int tabnr; int item; @@ -1434,7 +1461,7 @@ test_gui_tabmenu_event(dict_T *args UNUS item = (int)dict_get_number(args, (char_u *)"item"); send_tabline_menu_event(tabnr, item); -# endif +# endif return TRUE; } # endif @@ -1456,6 +1483,8 @@ f_test_gui_event(typval_T *argvars UNUSE event = tv_get_string(&argvars[0]); if (STRCMP(event, "dropfiles") == 0) rettv->vval.v_number = test_gui_drop_files(argvars[1].vval.v_dict); + else if (STRCMP(event, "findrepl") == 0) + rettv->vval.v_number = test_gui_find_repl(argvars[1].vval.v_dict); else if (STRCMP(event, "mouse") == 0) rettv->vval.v_number = test_gui_mouse_event(argvars[1].vval.v_dict); else if (STRCMP(event, "tabline") == 0) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4263, +/**/ 4262, /**/ 4261,