To: vim_dev@googlegroups.com Subject: Patch 8.2.4276 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4276 Problem: Separate test function for the GUI scrollbar. Solution: Use test_gui_event(). (Yegappan Lakshmanan, closes #9674) Files: runtime/doc/builtin.txt, runtime/doc/testing.txt, runtime/doc/usr_41.txt, src/evalfunc.c, src/testing.c, src/proto/testing.pro, src/testdir/test_gui.vim, src/testdir/test_vim9_builtin.vim *** ../vim-8.2.4275/runtime/doc/builtin.txt 2022-01-31 12:26:47.847706522 +0000 --- runtime/doc/builtin.txt 2022-01-31 17:35:24.613849342 +0000 *************** *** 654,661 **** test_option_not_set({name}) none reset flag indicating option was set test_override({expr}, {val}) none test with Vim internal overrides test_refcount({expr}) Number get the reference count of {expr} - test_scrollbar({which}, {value}, {dragging}) - none scroll in the GUI for testing test_setmouse({row}, {col}) none set the mouse position for testing test_settime({expr}) none set current time for testing test_srand_seed([seed]) none set seed for testing srand() --- 654,659 ---- *************** *** 89,94 **** --- 92,98 ---- "dropfiles" drop one or more files in a window. "findrepl" search and replace text "mouse" mouse button click event. + "scrollbar" move or drag the scrollbar "tabline" select a tab page by mouse click. "tabmenu" select a tabline menu entry. *************** *** 146,151 **** --- 150,171 ---- 8 alt is pressed 16 ctrl is pressed + "scrollbar": + Set or drag the left, right or horizontal scrollbar. Only + works when the scrollbar actually exists. The supported + items in {args} are: + which: scrollbar. The supported values are: + left Left scrollbar of the current window + right Right scrollbar of the current window + hor Horizontal scrollbar + value: amount to scroll. For the vertical scrollbars + the value can be 1 to the line-count of the + buffer. For the horizontal scrollbar the + value can be between 1 and the maximum line + length, assuming 'wrap' is not set. + dragging: 1 to drag the scrollbar and 0 to click in the + scrollbar. + "tabline": Inject a mouse click event on the tabline to select a tabpage. The supported items in {args} are: *************** *** 287,312 **** GetVarname()->test_refcount() - test_scrollbar({which}, {value}, {dragging}) *test_scrollbar()* - Pretend using scrollbar {which} to move it to position - {value}. {which} can be: - left Left scrollbar of the current window - right Right scrollbar of the current window - hor Horizontal scrollbar - - For the vertical scrollbars {value} can be 1 to the - line-count of the buffer. For the horizontal scrollbar the - {value} can be between 1 and the maximum line length, assuming - 'wrap' is not set. - - When {dragging} is non-zero it's like dragging the scrollbar, - otherwise it's like clicking in the scrollbar. - Only works when the {which} scrollbar actually exists, - obviously only when using the GUI. - - Can also be used as a |method|: > - GetValue()->test_scrollbar('right', 0) - test_setmouse({row}, {col}) *test_setmouse()* Set the mouse position to be used for the next mouse action. {row} and {col} are one based. --- 301,306 ---- *** ../vim-8.2.4275/runtime/doc/usr_41.txt 2022-01-31 12:26:47.847706522 +0000 --- runtime/doc/usr_41.txt 2022-01-31 17:35:24.613849342 +0000 *************** *** 1039,1045 **** test_setmouse() set the mouse position test_feedinput() add key sequence to input buffer test_option_not_set() reset flag indicating option was set - test_scrollbar() simulate scrollbar movement in the GUI test_refcount() return an expression's reference count test_srand_seed() set the seed value for srand() test_unknown() return a value with unknown type --- 1130,1135 ---- *** ../vim-8.2.4275/src/evalfunc.c 2022-01-31 14:59:33.514943760 +0000 --- src/evalfunc.c 2022-01-31 17:35:24.617849284 +0000 *************** *** 933,939 **** static argcheck_T arg3_string_bool_bool[] = {arg_string, arg_bool, arg_bool}; static argcheck_T arg3_string_bool_dict[] = {arg_string, arg_bool, arg_dict_any}; static argcheck_T arg3_string_number_bool[] = {arg_string, arg_number, arg_bool}; - static argcheck_T arg3_string_number_number[] = {arg_string, arg_number, arg_number}; static argcheck_T arg3_string_string_bool[] = {arg_string, arg_string, arg_bool}; static argcheck_T arg3_string_string_dict[] = {arg_string, arg_string, arg_dict_any}; static argcheck_T arg3_string_string_number[] = {arg_string, arg_string, arg_number}; --- 933,938 ---- *************** *** 2359,2372 **** ret_void, f_test_override}, {"test_refcount", 1, 1, FEARG_1, NULL, ret_number, f_test_refcount}, - {"test_scrollbar", 3, 3, FEARG_2, arg3_string_number_number, - ret_void, - #ifdef FEAT_GUI - f_test_scrollbar - #else - NULL - #endif - }, {"test_setmouse", 2, 2, 0, arg2_number, ret_void, f_test_setmouse}, {"test_settime", 1, 1, FEARG_1, arg1_number, --- 2358,2363 ---- *** ../vim-8.2.4275/src/testing.c 2022-01-30 18:00:22.703274483 +0000 --- src/testing.c 2022-01-31 17:35:24.617849284 +0000 *************** *** 1253,1302 **** rettv->v_type = VAR_VOID; } - #ifdef FEAT_GUI - void - f_test_scrollbar(typval_T *argvars, typval_T *rettv UNUSED) - { - char_u *which; - long value; - int dragging; - scrollbar_T *sb = NULL; - - if (check_for_string_arg(argvars, 0) == FAIL - || check_for_number_arg(argvars, 1) == FAIL - || check_for_number_arg(argvars, 2) == FAIL) - return; - - if (argvars[0].v_type != VAR_STRING - || (argvars[1].v_type) != VAR_NUMBER - || (argvars[2].v_type) != VAR_NUMBER) - { - emsg(_(e_invalid_argument)); - return; - } - which = tv_get_string(&argvars[0]); - value = tv_get_number(&argvars[1]); - dragging = tv_get_number(&argvars[2]); - - if (STRCMP(which, "left") == 0) - sb = &curwin->w_scrollbars[SBAR_LEFT]; - else if (STRCMP(which, "right") == 0) - sb = &curwin->w_scrollbars[SBAR_RIGHT]; - else if (STRCMP(which, "hor") == 0) - sb = &gui.bottom_sbar; - if (sb == NULL) - { - semsg(_(e_invalid_argument_str), which); - return; - } - gui_drag_scrollbar(sb, value, dragging); - # ifndef USE_ON_FLY_SCROLL - // need to loop through normal_cmd() to handle the scroll events - exec_normal(FALSE, TRUE, FALSE); - # endif - } - #endif - void f_test_setmouse(typval_T *argvars, typval_T *rettv UNUSED) { --- 1253,1258 ---- *************** *** 1430,1435 **** --- 1386,1428 ---- } static int + test_gui_scrollbar(dict_T *args) + { + char_u *which; + long value; + int dragging; + scrollbar_T *sb = NULL; + + if (dict_find(args, (char_u *)"which", -1) == NULL + || dict_find(args, (char_u *)"value", -1) == NULL + || dict_find(args, (char_u *)"dragging", -1) == NULL) + return FALSE; + + which = dict_get_string(args, (char_u *)"which", FALSE); + value = (long)dict_get_number(args, (char_u *)"value"); + dragging = (int)dict_get_number(args, (char_u *)"dragging"); + + if (STRCMP(which, "left") == 0) + sb = &curwin->w_scrollbars[SBAR_LEFT]; + else if (STRCMP(which, "right") == 0) + sb = &curwin->w_scrollbars[SBAR_RIGHT]; + else if (STRCMP(which, "hor") == 0) + sb = &gui.bottom_sbar; + if (sb == NULL) + { + semsg(_(e_invalid_argument_str), which); + return FALSE; + } + gui_drag_scrollbar(sb, value, dragging); + # ifndef USE_ON_FLY_SCROLL + // need to loop through normal_cmd() to handle the scroll events + exec_normal(FALSE, TRUE, FALSE); + # endif + + return TRUE; + } + + static int test_gui_tabline_event(dict_T *args UNUSED) { # ifdef FEAT_GUI_TABLINE *************** *** 1487,1492 **** --- 1480,1487 ---- 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, "scrollbar") == 0) + rettv->vval.v_number = test_gui_scrollbar(argvars[1].vval.v_dict); else if (STRCMP(event, "tabline") == 0) rettv->vval.v_number = test_gui_tabline_event(argvars[1].vval.v_dict); else if (STRCMP(event, "tabmenu") == 0) *** ../vim-8.2.4275/src/proto/testing.pro 2022-01-30 12:36:48.732985521 +0000 --- src/proto/testing.pro 2022-01-31 17:35:24.617849284 +0000 *************** *** 32,38 **** void f_test_null_string(typval_T *argvars, typval_T *rettv); void f_test_unknown(typval_T *argvars, typval_T *rettv); void f_test_void(typval_T *argvars, typval_T *rettv); - void f_test_scrollbar(typval_T *argvars, typval_T *rettv); void f_test_setmouse(typval_T *argvars, typval_T *rettv); void f_test_gui_event(typval_T *argvars, typval_T *rettv); void f_test_settime(typval_T *argvars, typval_T *rettv); --- 32,37 ---- *** ../vim-8.2.4275/src/testdir/test_gui.vim 2022-01-30 18:00:22.703274483 +0000 --- src/testdir/test_gui.vim 2022-01-31 17:35:24.617849284 +0000 *************** *** 714,726 **** set guioptions+=rlb " scroll to move line 11 at top, moves the cursor there ! eval 10->test_scrollbar('left', 0) redraw call assert_equal(1, winline()) call assert_equal(11, line('.')) " scroll to move line 1 at top, cursor stays in line 11 ! call test_scrollbar('right', 0, 0) redraw call assert_equal(11, winline()) call assert_equal(11, line('.')) --- 714,728 ---- set guioptions+=rlb " scroll to move line 11 at top, moves the cursor there ! let args = #{which: 'left', value: 10, dragging: 0} ! call test_gui_event('scrollbar', args) redraw call assert_equal(1, winline()) call assert_equal(11, line('.')) " scroll to move line 1 at top, cursor stays in line 11 ! let args = #{which: 'right', value: 0, dragging: 0} ! call test_gui_event('scrollbar', args) redraw call assert_equal(11, winline()) call assert_equal(11, line('.')) *************** *** 737,743 **** call assert_equal(1, col('.')) " scroll to character 11, cursor is moved ! call test_scrollbar('hor', 10, 0) redraw call assert_equal(1, wincol()) set number --- 739,746 ---- call assert_equal(1, col('.')) " scroll to character 11, cursor is moved ! let args = #{which: 'hor', value: 10, dragging: 0} ! call test_gui_event('scrollbar', args) redraw call assert_equal(1, wincol()) set number *************** *** 747,752 **** --- 750,762 ---- redraw call assert_equal(11, col('.')) + " Invalid arguments + call assert_false(test_gui_event('scrollbar', {})) + call assert_false(test_gui_event('scrollbar', #{value: 10, dragging: 0})) + call assert_false(test_gui_event('scrollbar', #{which: 'hor', dragging: 0})) + call assert_false(test_gui_event('scrollbar', #{which: 'hor', value: 1})) + call assert_fails("call test_gui_event('scrollbar', #{which: 'a', value: 1, dragging: 0})", 'E475:') + set guioptions& set wrap& bwipe! *************** *** 1346,1351 **** --- 1356,1363 ---- 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: 1, 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} *************** *** 1460,1465 **** --- 1472,1489 ---- 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, '$')) + + " Invalid arguments + call assert_false(test_gui_event('findrepl', {})) + let args = #{repl_text: 'a', flags: 1, forward: 1} + call assert_false(test_gui_event('findrepl', args)) + let args = #{find_text: 'a', flags: 1, forward: 1} + call assert_false(test_gui_event('findrepl', args)) + let args = #{find_text: 'a', repl_text: 'b', forward: 1} + call assert_false(test_gui_event('findrepl', args)) + let args = #{find_text: 'a', repl_text: 'b', flags: 1} + call assert_false(test_gui_event('findrepl', args)) + bw! endfunc *** ../vim-8.2.4275/src/testdir/test_vim9_builtin.vim 2022-01-30 15:28:26.642295028 +0000 --- src/testdir/test_vim9_builtin.vim 2022-01-31 17:35:24.617849284 +0000 *************** *** 4089,4101 **** v9.CheckDefAndScriptFailure(['test_override("a", "x")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) enddef - def Test_test_scrollbar() - CheckGui - v9.CheckDefAndScriptFailure(['test_scrollbar(1, 2, 3)'], ['E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1']) - v9.CheckDefAndScriptFailure(['test_scrollbar("a", "b", 3)'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) - v9.CheckDefAndScriptFailure(['test_scrollbar("a", 2, "c")'], ['E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3']) - enddef - def Test_test_setmouse() v9.CheckDefAndScriptFailure(['test_setmouse("a", 10)'], ['E1013: Argument 1: type mismatch, expected number but got string', 'E1210: Number required for argument 1']) v9.CheckDefAndScriptFailure(['test_setmouse(10, "b")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) --- 4089,4094 ---- *** ../vim-8.2.4275/src/version.c 2022-01-31 17:26:00.602083093 +0000 --- src/version.c 2022-01-31 17:37:25.828074482 +0000 *************** *** 748,749 **** --- 748,751 ---- { /* Add new patch number below this line */ + /**/ + 4276, /**/ -- BEDEVERE: Why do you think she is a witch? SECOND VILLAGER: She turned me into a newt. BEDEVERE: A newt? SECOND VILLAGER: (After looking at himself for some time) I got better. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///