patch 9.1.1370: CI Tests favor GTK2 over GTK3
Problem: CI Tests favor GTK2 over GTK3
Solution: Install GTK3 dependencies and debug packages for CI workflows,
update ASAN suppression list, update required dependency
checks for the tests (Drew Vogel)
closes: #17253
Signed-off-by: Drew Vogel <dvogel@github>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index cdc0562..a5bd4e2 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -111,22 +111,50 @@
run: |
sudo bash ci/remove_snap.sh
+ - name: Enable debug packages
+ run: |
+ # Some of the ASAN suppressions are in libraries linked with dlopen
+ # and symbolization of them requires these debug packages.
+ sudo apt install ubuntu-dbgsym-keyring
+ sudo cp ci/ddebs.list /etc/apt/sources.list.d/ddebs.list
+ sudo cp ci/pinned-pkgs /etc/apt/preferences.d/pinned-pkgs
+
- name: Install packages
run: |
# This is added by default, and it is often broken, but we don't need anything from it
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
-
PKGS=( \
gettext \
- libgtk2.0-dev:${{ matrix.architecture }} \
+ libgtk-3-dev:${{ matrix.architecture }} \
+ libgtk-3-bin:${{ matrix.architecture }} \
desktop-file-utils \
+ libc6-dbgsym:${{ matrix.architecture }} \
libtool-bin \
libncurses-dev:${{ matrix.architecture }} \
libxt-dev:${{ matrix.architecture }} \
+ libegl-mesa0:${{ matrix.architecture }} \
+ libegl1:${{ matrix.architecture }} \
+ libegl1-mesa-dev:${{ matrix.architecture }} \
+ libepoxy-dev:${{ matrix.architecture }} \
+ libwayland-egl1:${{ matrix.architecture }} \
+ libwayland-client0:${{ matrix.architecture }} \
+ libwayland-cursor0:${{ matrix.architecture }} \
locales-all \
software-properties-common \
sway \
)
+ if ${{ contains(matrix.extra, 'asan') }} && ${{ contains(matrix.architecture, 'native') }}; then
+ PKGS+=( \
+ libepoxy0-dbgsym:${{ matrix.architecture }} \
+ libxdamage1-dbgsym:${{ matrix.architecture }} \
+ libxcb1-dbgsym:${{ matrix.architecture }} \
+ libgtk-3-bin-dbgsym:${{ matrix.architecture }} \
+ libgtk-3-0t64-dbgsym:${{ matrix.architecture }} \
+ libglib2.0-0t64-dbgsym:${{ matrix.architecture }} \
+ libglib2.0-bin-dbgsym:${{ matrix.architecture }} \
+ libglib2.0-dev-bin-dbgsym:${{ matrix.architecture }} \
+ )
+ fi
if ${{ matrix.features == 'huge' }}; then
LUA_VER=${{ matrix.lua_ver || '5.4' }}
PKGS+=( \
@@ -146,8 +174,7 @@
libattr1-dev
)
fi
-
- sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install -y "${PKGS[@]}"
+ sudo apt-get update && sudo apt-get upgrade -y --allow-downgrades && sudo apt-get install -y --allow-downgrades "${PKGS[@]}"
- name: Install gcc-${{ env.GCC_VER }}
if: matrix.compiler == 'gcc'
@@ -225,6 +252,8 @@
echo "TEST=-C runtime/doc vimtags VIMEXE=../../${SRCDIR}/vim"
fi
echo "CFLAGS=${CFLAGS}"
+ # Disables GTK attempt to integrate with the accessibility service that does run in CI.
+ echo "NO_AT_BRIDGE=1"
) >> $GITHUB_ENV
- name: Set up system
@@ -281,15 +310,6 @@
fi
- name: Test
- if: matrix.architecture != 'arm64'
- timeout-minutes: 25
- run: |
- make ${SHADOWOPT} ${TEST}
-
-
- # `sg audio` does not work on arm64 runner due to permission ('Incorrect password' error).
- - name: Test on arm64
- if: matrix.architecture == 'arm64'
timeout-minutes: 25
run: |
make ${SHADOWOPT} ${TEST}
diff --git a/Filelist b/Filelist
index 17ec8df..85e4d32 100644
--- a/Filelist
+++ b/Filelist
@@ -27,6 +27,8 @@
ci/setup-xvfb.sh \
ci/setup-sway.sh \
ci/remove_snap.sh \
+ ci/ddebs.list \
+ ci/pinned-pkgs \
src/Make_all.mak \
src/README.md \
src/alloc.c \
diff --git a/ci/ddebs.list b/ci/ddebs.list
new file mode 100644
index 0000000..e4491a6
--- /dev/null
+++ b/ci/ddebs.list
@@ -0,0 +1,3 @@
+deb http://ddebs.ubuntu.com noble main restricted universe multiverse
+deb http://ddebs.ubuntu.com noble-updates main restricted universe multiverse
+deb http://ddebs.ubuntu.com noble-proposed main restricted universe multiverse
diff --git a/ci/pinned-pkgs b/ci/pinned-pkgs
new file mode 100644
index 0000000..0603e14
--- /dev/null
+++ b/ci/pinned-pkgs
@@ -0,0 +1,69 @@
+# Unfortunately ubtunu does not keep the debug packages strictly up-to-date
+# with the main packages. So this file needs to pin the main packages back to
+# the version for which debug packages are available.
+
+Package: libwayland-client0
+Pin: version 1.20.0-1
+Pin-Priority: 1000
+
+Package: libwayland-client0
+Pin: version 1.20.0-1ubuntu0.1
+Pin-Priority: 100
+
+Package: libwayland-cursor0
+Pin: version 1.20.0-1
+Pin-Priority: 1000
+
+Package: libwayland-cursor0
+Pin: version 1.20.0-1ubuntu0.1
+Pin-Priority: 100
+
+Package: libwayland-egl1
+Pin: version 1.20.0-1
+Pin-Priority: 1000
+
+Package: libwayland-egl1
+Pin: version 1.20.0-1ubuntu0.1
+Pin-Priority: 100
+
+Package: libwayland-dev
+Pin: version 1.20.0-1
+Pin-Priority: 1000
+
+Package: libwayland-dev
+Pin: version 1.20.0-1ubuntu0.1
+Pin-Priority: 100
+
+Package: libwayland-server0
+Pin: version 1.20.0-1
+Pin-Priority: 1000
+
+Package: libwayland-server0
+Pin: version 1.20.0-1ubuntu0.1
+Pin-Priority: 100
+
+Package: libwayland-bin
+Pin: version 1.20.0-1
+Pin-Priority: 1000
+
+Package: libwayland-bin
+Pin: version 1.20.0-1ubuntu0.1
+Pin-Priority: 100
+
+# As of 2025-04-27 the base library package libgtk-3-0t64 is still at 3.24.41-4ubuntu1.2
+Package: libgtk-3-0t64-dbgsym
+Pin: version 3.24.41-4ubuntu1.2
+Pin-Priority: 1000
+
+Package: libgtk-3-0t64-dbgsym
+Pin: version 3.24.41-4ubuntu1.3
+Pin-Priority: 100
+
+# As of 2025-04-27 the base binary package libgtk-3-bin is still at 3.24.41-4ubuntu1.2
+Package: libgtk-3-bin-dbgsym
+Pin: version 3.24.41-4ubuntu1.2
+Pin-Priority: 1000
+
+Package: libgtk-3-bin-dbgsym
+Pin: version 3.24.41-4ubuntu1.3
+Pin-Priority: 100
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 2a11c4a..762bdc1 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -4531,11 +4531,14 @@
pixel_width = (guint)(gui_get_base_width() + Columns * gui.char_width);
pixel_height = (guint)(gui_get_base_height() + Rows * gui.char_height);
+
+# if !GTK_CHECK_VERSION(3,0,0)
// For GTK2 changing the size of the form widget doesn't cause window
// resizing.
if (gtk_socket_id == 0)
gtk_window_resize(GTK_WINDOW(gui.mainwin), pixel_width, pixel_height);
update_window_manager_hints(0, 0);
+# endif
if (foreground_argument != NULL)
fg_pixel = gui_get_color((char_u *)foreground_argument);
diff --git a/src/testdir/check.vim b/src/testdir/check.vim
index a60dd90..76f6692 100644
--- a/src/testdir/check.vim
+++ b/src/testdir/check.vim
@@ -127,13 +127,39 @@
endif
endfunc
+func SetupWindowSizeToForVisualDumps()
+ " The dumps used as reference in these tests were created with a terminal
+ " width of 75 columns. The vim window that uses the remainder of the GUI
+ " window width must be at least 3 columns. In theory this means we need the
+ " GUI shell to provide 78+ columns. However the GTK3 resize logic is flaky,
+ " sometimes resulting in X11 Configure events that are narrower than
+ " expected by a number of pixels equal to 2 column widths. Therefore
+ " setting 80 columns ensures that the GUI shell can still provide 78+
+ " columns. This is very likely papering over a GTK3 resize bug but one that
+ " has existed for a very long time. Establishing this workaround is meant to
+ " get the GTK3 code working under CI so that we can focus on removing this
+ " over the long term.
+ if &columns != 80
+ set columns=80
+ endif
+ " Without resetting lines, some GTK3 resize events can carry over between
+ " tests, which invalidate assumptions in the scrollbar offset calculations.
+ if &lines != 25
+ set lines=25
+ endif
+endfunc
+
" Command to check that making screendumps is supported.
" Caller must source screendump.vim
command CheckScreendump call CheckScreendump()
func CheckScreendump()
+ let g:check_screendump_called = v:true
if !CanRunVimInTerminal()
throw 'Skipped: cannot make screendumps'
endif
+ if has('gui_running')
+ call SetupWindowSizeToForVisualDumps()
+ endif
endfunc
" Command to check that we can Run Vim in a terminal window
diff --git a/src/testdir/lsan-suppress.txt b/src/testdir/lsan-suppress.txt
index 8e1451e..46421d3 100644
--- a/src/testdir/lsan-suppress.txt
+++ b/src/testdir/lsan-suppress.txt
@@ -11,3 +11,6 @@
leak:libpython*.so.*
leak:libruby*.so.*
leak:libxcb*.so.*
+# The renderer leaks 128 bytes of metadata when run under CI. Seems to only
+# happen with software rendering.
+leak:gdk_x11_screen_init_gl
diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim
index c14f44e..0d53121 100644
--- a/src/testdir/runtest.vim
+++ b/src/testdir/runtest.vim
@@ -606,6 +606,8 @@
" A test can set g:test_is_flaky to retry running the test.
let g:test_is_flaky = 0
+ let g:check_screendump_called = v:false
+
" A test can set g:max_run_nr to change the max retry count.
let g:max_run_nr = 5
if has('mac')
diff --git a/src/testdir/screendump.vim b/src/testdir/screendump.vim
index 744f2ab..d7207d4 100644
--- a/src/testdir/screendump.vim
+++ b/src/testdir/screendump.vim
@@ -48,6 +48,10 @@
" message. Use this when using the same dump file with different options.
" Returns non-zero when verification fails.
func VerifyScreenDump(buf, filename, options, ...)
+ if has('gui_running') && exists("g:check_screendump_called") && g:check_screendump_called == v:false
+ echoerr "VerifyScreenDump() called from a test that lacks a CheckScreendump guard."
+ return 1
+ endif
let reference = 'dumps/' . a:filename . '.dump'
let filter = 'dumps/' . a:filename . '.vim'
let testfile = 'failed/' . a:filename . '.dump'
diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim
index 8d083db..192c436 100644
--- a/src/testdir/test_autocmd.vim
+++ b/src/testdir/test_autocmd.vim
@@ -580,6 +580,7 @@
endfunc
func Test_WinScrolled_once_only()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -609,6 +610,7 @@
" Check that WinScrolled is not triggered immediately when defined and there
" are split windows.
func Test_WinScrolled_not_when_defined()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3024,6 +3026,7 @@
func Test_autocmd_nested_switch_window()
" run this in a separate Vim so that SafeState works
CheckRunVimInTerminal
+ CheckScreendump
let lines =<< trim END
vim9script
diff --git a/src/testdir/test_balloon.vim b/src/testdir/test_balloon.vim
index 3db37a7..1a9e225 100644
--- a/src/testdir/test_balloon.vim
+++ b/src/testdir/test_balloon.vim
@@ -6,7 +6,6 @@
CheckFeature balloon_eval_term
source screendump.vim
-CheckScreendump
let s:common_script =<< trim [CODE]
call setline(1, ["one one one", "two tXo two", "three three three"])
@@ -19,6 +18,7 @@
[CODE]
func Test_balloon_eval_term()
+ CheckScreendump
" Use <Ignore> after <MouseMove> to return from vgetc() without removing
" the balloon.
let xtra_lines =<< trim [CODE]
@@ -49,6 +49,7 @@
endfunc
func Test_balloon_eval_term_visual()
+ CheckScreendump
" Use <Ignore> after <MouseMove> to return from vgetc() without removing
" the balloon.
call writefile(s:common_script + [
@@ -66,6 +67,7 @@
endfunc
func Test_balloon_eval_term_rightleft()
+ CheckScreendump
CheckFeature rightleft
" Use <Ignore> after <MouseMove> to return from vgetc() without removing
diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim
index 9b2fee3..68933a3 100644
--- a/src/testdir/test_cmdline.vim
+++ b/src/testdir/test_cmdline.vim
@@ -2637,6 +2637,7 @@
" Test for using a popup menu for the command line completion matches
" (wildoptions=pum)
func Test_wildmenu_pum()
+ CheckScreendump
CheckRunVimInTerminal
let commands =<< trim [CODE]
@@ -2929,6 +2930,7 @@
endfunc
func Test_wildmenu_with_pum_foldexpr()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2954,6 +2956,7 @@
" The popup menu should be positioned correctly over the status line of the
" bottom-most window.
func Test_wildmenu_pum_from_terminal()
+ CheckScreendump
CheckRunVimInTerminal
let python = PythonProg()
call CheckPython(python)
@@ -2974,6 +2977,7 @@
endfunc
func Test_wildmenu_pum_odd_wildchar()
+ CheckScreendump
CheckRunVimInTerminal
" Test odd wildchar interactions with pum. Make sure they behave properly
diff --git a/src/testdir/test_conceal.vim b/src/testdir/test_conceal.vim
index 2ce7384..bac3ed1 100644
--- a/src/testdir/test_conceal.vim
+++ b/src/testdir/test_conceal.vim
@@ -559,6 +559,8 @@
" Test that cursor is drawn at the correct column when it is after end of the
" line with 'virtualedit' and concealing.
func Run_test_conceal_virtualedit_after_eol(wrap)
+ CheckScreendump
+
let code =<< trim eval [CODE]
let &wrap = {a:wrap}
call setline(1, 'abcdefgh|hidden|ijklmnpop')
@@ -591,6 +593,8 @@
" Same as Run_test_conceal_virtualedit_after_eol(), but with 'rightleft'.
func Run_test_conceal_virtualedit_after_eol_rightleft(wrap)
+ CheckScreendump
+
let code =<< trim eval [CODE]
let &wrap = {a:wrap}
call setline(1, 'abcdefgh|hidden|ijklmnpop')
@@ -624,6 +628,8 @@
" Test that cursor position is correct when double-width chars are concealed.
func Run_test_conceal_double_width(wrap)
+ CheckScreendump
+
let code =<< trim eval [CODE]
let &wrap = {a:wrap}
call setline(1, ['aaaaa口=口bbbbb口=口ccccc', 'foobar'])
diff --git a/src/testdir/test_crash.vim b/src/testdir/test_crash.vim
index 85b1290..80c1ccf 100644
--- a/src/testdir/test_crash.vim
+++ b/src/testdir/test_crash.vim
@@ -218,6 +218,7 @@
endfunc
func Test_crash2()
+ CheckScreendump
" The following used to crash Vim
let opts = #{wait_for_ruler: 0, rows: 20}
let args = ' -u NONE -i NONE -n -e -s -S '
diff --git a/src/testdir/test_cursor_func.vim b/src/testdir/test_cursor_func.vim
index 8766f97..1fd6b5f 100644
--- a/src/testdir/test_cursor_func.vim
+++ b/src/testdir/test_cursor_func.vim
@@ -92,6 +92,10 @@
endfunc
func Test_screenpos()
+ if has('gui_running')
+ set lines=25
+ set columns=78
+ endif
rightbelow new
rightbelow 20vsplit
call setline(1, ["\tsome text", "long wrapping line here", "next line"])
diff --git a/src/testdir/test_delete.vim b/src/testdir/test_delete.vim
index c00b8ca..6323f9a 100644
--- a/src/testdir/test_delete.vim
+++ b/src/testdir/test_delete.vim
@@ -111,6 +111,7 @@
" This should no longer trigger ml_get errors
func Test_delete_ml_get_errors()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
set noshowcmd noruler scrolloff=0
diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim
index d0c2f18..dadffec 100644
--- a/src/testdir/test_diffmode.vim
+++ b/src/testdir/test_diffmode.vim
Binary files differ
diff --git a/src/testdir/test_display.vim b/src/testdir/test_display.vim
index 86e400e..8f3806b 100644
--- a/src/testdir/test_display.vim
+++ b/src/testdir/test_display.vim
@@ -377,6 +377,8 @@
endfunc
func Run_Test_display_lastline(euro)
+ CheckScreendump
+
let lines =<< trim END
call setline(1, ['aaa', 'b'->repeat(200)])
set display=truncate
diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim
index b925b23..a212e8c 100644
--- a/src/testdir/test_edit.vim
+++ b/src/testdir/test_edit.vim
@@ -2021,6 +2021,7 @@
" Test for positioning cursor after CTRL-R expression failed
func Test_edit_ctrl_r_failed()
+ CheckScreendump
CheckRunVimInTerminal
let buf = RunVimInTerminal('', #{rows: 6, cols: 60})
diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim
index 28800f1..847987b 100644
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -951,18 +951,6 @@
execute "normal! gR\<C-o>g@l\<Esc>"
call assert_equal('n-niV', g:current_modes)
- " Test statusline updates for overstrike mode
- if CanRunVimInTerminal()
- let buf = RunVimInTerminal('', {'rows': 12})
- call term_sendkeys(buf, ":set laststatus=2 statusline=%!mode(1)\<CR>")
- call term_sendkeys(buf, ":")
- call TermWait(buf)
- call VerifyScreenDump(buf, 'Test_mode_1', {})
- call term_sendkeys(buf, "\<Insert>")
- call TermWait(buf)
- call VerifyScreenDump(buf, 'Test_mode_2', {})
- call StopVimInTerminal(buf)
- endif
if has('terminal')
term
@@ -990,6 +978,22 @@
delfunction OperatorFunc
endfunc
+" Test for the mode() function using Screendump feature
+func Test_mode_screendump()
+ CheckScreendump
+
+ " Test statusline updates for overstrike mode
+ let buf = RunVimInTerminal('', {'rows': 12})
+ call term_sendkeys(buf, ":set laststatus=2 statusline=%!mode(1)\<CR>")
+ call term_sendkeys(buf, ":")
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_mode_1', {})
+ call term_sendkeys(buf, "\<Insert>")
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_mode_2', {})
+ call StopVimInTerminal(buf)
+endfunc
+
" Test for append()
func Test_append()
enew!
@@ -1028,7 +1032,7 @@
call setline(3, test_null_list())
call setline(2, ["baz"])
call assert_equal(['bar', 'baz'], getline(1, '$'))
- close!
+ bw!
endfunc
func Test_getbufvar()
diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim
index 2925934..9d31996 100644
--- a/src/testdir/test_gui.vim
+++ b/src/testdir/test_gui.vim
@@ -770,13 +770,10 @@
endfunc
func Test_scrollbars()
- " this test sometimes fails on CI
- let g:test_is_flaky = 1
-
" buffer with 200 lines
- new
call setline(1, repeat(['one', 'two'], 100))
- set guioptions+=rlb
+ set scrolloff=0
+ set guioptions=rlbk
" scroll to move line 11 at top, moves the cursor there
let args = #{which: 'left', value: 10, dragging: 0}
@@ -826,6 +823,7 @@
call assert_fails("call test_gui_event('scrollbar', #{which: 'a', value: 1, dragging: 0})", 'E475:')
set guioptions&
+ set scrolloff&
set wrap&
bwipe!
endfunc
diff --git a/src/testdir/test_hlsearch.vim b/src/testdir/test_hlsearch.vim
index eb8fb87..557fe5d 100644
--- a/src/testdir/test_hlsearch.vim
+++ b/src/testdir/test_hlsearch.vim
@@ -74,6 +74,7 @@
endfunc
func Test_hlsearch_Ctrl_R()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -92,6 +93,7 @@
endfunc
func Test_hlsearch_clipboard()
+ CheckScreendump
CheckRunVimInTerminal
CheckFeature clipboard_working
diff --git a/src/testdir/test_match.vim b/src/testdir/test_match.vim
index eb77791..1e42aba 100644
--- a/src/testdir/test_match.vim
+++ b/src/testdir/test_match.vim
@@ -345,6 +345,7 @@
endfunc
func Test_matchclear_other_window()
+ CheckScreendump
CheckRunVimInTerminal
let buf = OtherWindowCommon()
call term_sendkeys(buf, ":call clearmatches(winid)\<CR>")
@@ -355,6 +356,7 @@
endfunc
func Test_matchadd_other_window()
+ CheckScreendump
CheckRunVimInTerminal
let buf = OtherWindowCommon()
call term_sendkeys(buf, ":call matchadd('Search', 'Hello', 1, -1, #{window: winid})\<CR>")
@@ -366,6 +368,7 @@
endfunc
func Test_match_in_linebreak()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -381,6 +384,7 @@
endfunc
func Test_match_with_incsearch()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -420,6 +424,7 @@
endfunc
func Test_match_tab_with_linebreak()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
diff --git a/src/testdir/test_menu.vim b/src/testdir/test_menu.vim
index 40fec40..8ac1da5 100644
--- a/src/testdir/test_menu.vim
+++ b/src/testdir/test_menu.vim
@@ -631,6 +631,7 @@
" Test for opening a menu drawn in the cmdline area
func Test_popupmenu_cmdline()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim
index 87b1131..e1eab59 100644
--- a/src/testdir/test_messages.vim
+++ b/src/testdir/test_messages.vim
@@ -324,6 +324,7 @@
" Test more-prompt scrollback
func Test_message_more_scrollback()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -348,6 +349,7 @@
endfunc
func Test_message_not_cleared_after_mode()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -383,6 +385,7 @@
endfunc
func Test_mode_cleared_after_silent_message()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -407,6 +410,7 @@
" Test verbose message before echo command
func Test_echo_verbose_system()
+ CheckScreendump
CheckRunVimInTerminal
CheckUnix " needs the "seq" command
CheckNotMac " the macos TMPDIR is too long for snapshot testing
diff --git a/src/testdir/test_move.vim b/src/testdir/test_move.vim
index 0412097..d932a60 100644
--- a/src/testdir/test_move.vim
+++ b/src/testdir/test_move.vim
@@ -47,6 +47,7 @@
endfunc
func Test_move_undo()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
diff --git a/src/testdir/test_popupwin_textprop.vim b/src/testdir/test_popupwin_textprop.vim
index 80b5a88..50e2848 100644
--- a/src/testdir/test_popupwin_textprop.vim
+++ b/src/testdir/test_popupwin_textprop.vim
@@ -5,9 +5,9 @@
CheckFeature textprop
source screendump.vim
-CheckScreendump
func Test_textprop_popup()
+ CheckScreendump
let lines =<< trim END
call setline(1, range(1, 100))
call setline(50, 'some text to work with')
@@ -55,6 +55,7 @@
endfunc
func Test_textprop_popup_corners()
+ CheckScreendump
let lines =<< trim END
call setline(1, range(1, 100))
call setline(50, 'now working with some longer text here')
@@ -115,6 +116,7 @@
endfunc
func Test_textprop_popup_offsets()
+ CheckScreendump
let lines =<< trim END
call setline(1, range(1, 100))
call setline(50, 'now working with some longer text here')
diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim
index 1e123d1..5a99b3b 100644
--- a/src/testdir/test_put.vim
+++ b/src/testdir/test_put.vim
Binary files differ
diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim
index 7529175..8ec513e 100644
--- a/src/testdir/test_search.vim
+++ b/src/testdir/test_search.vim
@@ -945,6 +945,7 @@
endfunc
func Test_incsearch_scrolling()
+ CheckScreendump
CheckRunVimInTerminal
call assert_equal(0, &scrolloff)
call writefile([
diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim
index 7f53d62..8304298 100644
--- a/src/testdir/test_signs.vim
+++ b/src/testdir/test_signs.vim
@@ -1813,6 +1813,7 @@
" Test for correct cursor position after the sign column appears or disappears.
func Test_sign_cursor_position()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
diff --git a/src/testdir/test_startup.vim b/src/testdir/test_startup.vim
index bc437a9..0b2b76a 100644
--- a/src/testdir/test_startup.vim
+++ b/src/testdir/test_startup.vim
@@ -900,6 +900,7 @@
endfunc
func Test_start_with_tabs()
+ CheckScreendump
CheckRunVimInTerminal
let buf = RunVimInTerminal('-p a b c', {})
diff --git a/src/testdir/test_statusline.vim b/src/testdir/test_statusline.vim
index 73c3bee..f2204db 100644
--- a/src/testdir/test_statusline.vim
+++ b/src/testdir/test_statusline.vim
@@ -16,6 +16,10 @@
endfunc
func s:get_statusline()
+ if has('gui_running')
+ redraw!
+ sleep 1m
+ endif
return ScreenLines(&lines - 1, &columns)[0]
endfunc
diff --git a/src/testdir/test_substitute.vim b/src/testdir/test_substitute.vim
index b25cd60..21527db 100644
--- a/src/testdir/test_substitute.vim
+++ b/src/testdir/test_substitute.vim
@@ -728,6 +728,7 @@
endfunc
func Test_sub_highlight_zero_match()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
diff --git a/src/testdir/test_syntax.vim b/src/testdir/test_syntax.vim
index 49f8833..d152ec5 100644
--- a/src/testdir/test_syntax.vim
+++ b/src/testdir/test_syntax.vim
@@ -631,6 +631,7 @@
" Check highlighting for a small piece of C code with a screen dump.
func Test_syntax_c()
+ CheckScreendump
CheckRunVimInTerminal
call writefile([
\ '/* comment line at the top */',
diff --git a/src/testdir/test_tabpage.vim b/src/testdir/test_tabpage.vim
index 1a40567..0e219e2 100644
--- a/src/testdir/test_tabpage.vim
+++ b/src/testdir/test_tabpage.vim
@@ -688,6 +688,7 @@
endfunc
func Test_tabpage_cmdheight()
+ CheckScreendump
CheckRunVimInTerminal
call writefile([
\ 'set laststatus=2',
diff --git a/src/testdir/test_termencoding.vim b/src/testdir/test_termencoding.vim
index 9b7f487..a45ff84 100644
--- a/src/testdir/test_termencoding.vim
+++ b/src/testdir/test_termencoding.vim
@@ -15,6 +15,7 @@
" running with 'encoding' "euc-jp". We need to make sure the text is in the
" right encoding, this is a bit tricky.
func Test_termencoding_euc_jp()
+ CheckScreendump
new
call setline(1, 'E89: バッファ %ld の変更は保存されていません (! で変更を破棄)')
write ++enc=euc-jp Xeuc_jp.txt
diff --git a/src/testdir/test_terminal.vim b/src/testdir/test_terminal.vim
index 9dbdfda..7476b49 100644
--- a/src/testdir/test_terminal.vim
+++ b/src/testdir/test_terminal.vim
@@ -522,6 +522,7 @@
endfunc
func Test_terminal_postponed_scrollback()
+ CheckScreendump
" tail -f only works on Unix
CheckUnix
@@ -1298,6 +1299,7 @@
" Run this first, it fails when run after other tests.
func Test_aa_terminal_focus_events()
+ CheckScreendump
CheckNotGui
CheckUnix
CheckRunVimInTerminal
@@ -1475,6 +1477,7 @@
endfunc
func Test_open_term_from_cmd()
+ CheckScreendump
CheckUnix
CheckRunVimInTerminal
@@ -1497,6 +1500,7 @@
endfunc
func Test_combining_double_width()
+ CheckScreendump
CheckUnix
CheckRunVimInTerminal
@@ -1666,6 +1670,7 @@
endfunc
func Test_terminal_dumpload_dump()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2168,6 +2173,7 @@
endfunc
func Test_terminal_ansicolors_default_reset_tgc()
+ CheckScreendump
CheckFeature termguicolors
CheckRunVimInTerminal
@@ -2261,6 +2267,7 @@
endfunc
func Test_terminal_all_ansi_colors()
+ CheckScreendump
CheckRunVimInTerminal
" Use all the ANSI colors.
diff --git a/src/testdir/test_terminal2.vim b/src/testdir/test_terminal2.vim
index 3e8ff86..195d0ba 100644
--- a/src/testdir/test_terminal2.vim
+++ b/src/testdir/test_terminal2.vim
@@ -499,6 +499,7 @@
endfunc
func Test_terminal_normal_mode()
+ CheckScreendump
CheckRunVimInTerminal
" Run Vim in a terminal and open a terminal window to run Vim in.
diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim
index 0e5f70b..64b8ac8 100644
--- a/src/testdir/test_terminal3.vim
+++ b/src/testdir/test_terminal3.vim
@@ -70,6 +70,7 @@
" Check a terminal with different colors
func Terminal_color(group_name, highlight_cmds, highlight_opt, open_cmds)
+ CheckScreendump
CheckRunVimInTerminal
CheckUnix
@@ -139,6 +140,7 @@
endfunc
func Test_terminal_color_wincolor_split()
+ CheckScreendump
CheckRunVimInTerminal
CheckUnix
@@ -246,6 +248,7 @@
endfunc
func Test_terminal_in_popup()
+ CheckScreendump
CheckRunVimInTerminal
let text =<< trim END
@@ -324,6 +327,7 @@
" Check a terminal in popup window uses the default minimum size.
func Test_terminal_in_popup_min_size()
+ CheckScreendump
CheckRunVimInTerminal
let text =<< trim END
@@ -356,6 +360,7 @@
" Check a terminal in popup window with different colors
func Terminal_in_popup_color(group_name, highlight_cmds, highlight_opt, popup_cmds, popup_opt)
+ CheckScreendump
CheckRunVimInTerminal
CheckUnix
diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim
index abc6365..d26efa9 100644
--- a/src/testdir/test_textprop.vim
+++ b/src/testdir/test_textprop.vim
@@ -1256,6 +1256,7 @@
func Test_textprop_hl_override()
CheckScreendump
+ CheckRunVimInTerminal
let lines =<< trim END
call setline(1, ['One one one one one', 'Two two two two two', 'Three three three three'])
@@ -1286,6 +1287,7 @@
endfunc
func RunTestVisualBlock(width, dump)
+ CheckScreendump
call writefile([
\ "call setline(1, ["
\ .. "'xxxxxxxxx 123 x',"
@@ -1992,6 +1994,7 @@
enddef
func Test_prop_in_linebreak()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2017,6 +2020,7 @@
endfunc
func Test_prop_with_linebreak()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2036,6 +2040,7 @@
endfunc
func Test_prop_with_wrap()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2054,6 +2059,7 @@
endfunc
func Test_prop_after_tab()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2070,6 +2076,7 @@
endfunc
func Test_prop_before_tab()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2109,6 +2116,7 @@
endfunc
func Test_prop_after_linebreak()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2558,6 +2566,7 @@
endfunc
func Test_prop_inserts_text()
+ CheckScreendump
CheckRunVimInTerminal
" Just a basic check for now
@@ -2609,6 +2618,7 @@
endfunc
func Test_prop_inserts_text_highlight()
+ CheckScreendump
CheckRunVimInTerminal
" Just a basic check for now
@@ -2644,6 +2654,7 @@
endfunc
func Test_prop_inserts_text_normal_gM()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2661,6 +2672,7 @@
endfunc
func Run_test_prop_inserts_text_normal_gj_gk(cmd)
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2695,6 +2707,7 @@
endfunc
func Test_prop_normal_gj_gk_gM_with_outer_virtual_text()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2737,6 +2750,7 @@
endfunc
func Test_prop_inserts_text_visual_block()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2765,6 +2779,7 @@
endfunc
func Run_test_prop_inserts_text_showbreak(cmd)
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2838,6 +2853,7 @@
endfunc
func Test_prop_before_tab_skipcol()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2875,6 +2891,7 @@
endfunc
func Test_prop_inserts_text_before_linebreak()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2894,6 +2911,7 @@
endfunc
func Test_prop_inserts_text_before_double_width_wrap()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2914,6 +2932,7 @@
endfunc
func Test_prop_inserts_text_lcs_extends()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2948,6 +2967,7 @@
endfunc
func Test_props_with_text_right_align_twice()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -2973,6 +2993,7 @@
endfunc
func Test_props_with_text_after()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3004,6 +3025,7 @@
endfunc
func Test_props_with_text_after_and_list()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3041,6 +3063,7 @@
endfunc
func Test_props_with_text_after_below_trunc()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3077,6 +3100,7 @@
endfunc
func Test_props_with_text_truncated_just_before_after()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3114,6 +3138,7 @@
endfunc
func Test_prop_with_text_below_after_empty()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3153,6 +3178,7 @@
endfunc
func Test_prop_with_text_above_below_empty()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3204,6 +3230,7 @@
endfunc
func Test_prop_multiple_lines_above()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3226,6 +3253,7 @@
endfunc
func Test_prop_with_multibyte_above()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3247,6 +3275,7 @@
endfunc
func Test_prop_with_multibyte_below()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3268,6 +3297,7 @@
endfunc
func Test_prop_with_text_below_rightleft()
+ CheckScreendump
CheckRunVimInTerminal
CheckFeature rightleft
@@ -3285,6 +3315,7 @@
endfunc
func Test_prop_with_text_above_empty()
+ CheckScreendump
CheckRunVimInTerminal
" check the cursor is in the correct line
@@ -3310,6 +3341,7 @@
endfunc
func Test_prop_with_text_below_after_match()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3333,6 +3365,7 @@
endfunc
func Test_props_with_text_after_joined()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3358,6 +3391,7 @@
endfunc
func Test_props_with_text_after_truncated()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3396,6 +3430,7 @@
endfunc
func Test_props_with_text_after_truncated_and_ambiwidth_is_double()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3422,6 +3457,7 @@
func Test_props_with_text_after_truncated_not_utf8()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3447,6 +3483,7 @@
endfunc
func Test_props_with_text_empty_line()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3480,6 +3517,7 @@
endfunc
func Test_props_with_text_after_wraps()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3504,6 +3542,7 @@
endfunc
func Test_props_with_text_after_nowrap()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3537,6 +3576,7 @@
endfunc
func Test_prop_with_text_below_cul()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3560,6 +3600,7 @@
endfunc
func Test_props_with_text_below_nowrap()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3592,6 +3633,7 @@
endfunc
func Test_props_with_text_above()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3654,6 +3696,7 @@
endfunc
func Test_prop_with_text_above_padding()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3690,6 +3733,7 @@
endfunc
func Test_prop_above_with_number()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3725,6 +3769,7 @@
endfunc
func Test_prop_above_with_linebreak()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3744,6 +3789,7 @@
endfunc
func Test_prop_above_and_before()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3770,6 +3816,7 @@
endfunc
func Test_prop_below_split_line()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3798,6 +3845,7 @@
endfunc
func Test_prop_above_below_smoothscroll()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3826,6 +3874,7 @@
endfunc
func Test_props_with_text_override()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3849,6 +3898,7 @@
endfunc
func Test_props_with_text_CursorMoved()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3887,6 +3937,7 @@
endfunc
func Test_props_with_text_after_split_join()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3956,6 +4007,7 @@
enddef
func Test_insert_text_start_incl()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -3997,6 +4049,7 @@
endfunc
func Test_insert_text_list_mode()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4026,6 +4079,7 @@
endfunc
func Test_insert_text_with_padding()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4078,6 +4132,7 @@
endfunc
func Test_long_text_below_with_padding()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4109,6 +4164,7 @@
endfunc
func Test_text_after_nowrap()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4173,6 +4229,7 @@
endfunc
func Test_text_after_nowrap_list()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4209,6 +4266,7 @@
endfunc
func Test_text_below_nowrap()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4238,6 +4296,7 @@
endfunc
func Test_virtual_text_overlap_with_highlight()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4278,6 +4337,7 @@
endfunc
func Test_virtual_text_in_popup_highlight()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4322,6 +4382,7 @@
endfunc
func Test_insert_text_change_arg()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4383,6 +4444,7 @@
enddef
func Test_text_prop_delete_updates()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4421,6 +4483,7 @@
endfunc
func Test_text_prop_diff_mode()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4459,6 +4522,7 @@
endfunc
func Test_error_after_using_negative_id()
+ CheckScreendump
" This needs to run a separate Vim instance because the
" "did_use_negative_pop_id" will be set.
CheckRunVimInTerminal
@@ -4495,6 +4559,7 @@
endfunc
func Test_modify_text_before_prop()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4517,6 +4582,7 @@
endfunc
func Test_overlong_textprop_above_crash()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4538,6 +4604,7 @@
endfunc
func Test_text_prop_list_hl_and_sign_highlight()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -4632,6 +4699,7 @@
endfunc
func Test_textprop_with_wincolor()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
diff --git a/src/testdir/test_undo.vim b/src/testdir/test_undo.vim
index 844ba77..af6cefe 100644
--- a/src/testdir/test_undo.vim
+++ b/src/testdir/test_undo.vim
@@ -849,6 +849,7 @@
endfunc
func Test_undo_after_write()
+ CheckScreendump
" use a terminal to make undo work like when text is typed
CheckRunVimInTerminal
diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim
index 991a095..61ea0d0 100644
--- a/src/testdir/test_utf8.vim
+++ b/src/testdir/test_utf8.vim
@@ -294,6 +294,7 @@
endfunc
func Test_setcellwidths_dump()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -311,6 +312,7 @@
" Test setcellwidths() on characters that are not targets of 'ambiwidth'.
func Test_setcellwidths_with_non_ambiwidth_character_dump()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
@@ -333,6 +335,7 @@
" For some reason this test causes Test_customlist_completion() to fail on CI,
" so run it as the last test.
func Test_zz_ambiwidth_hl_dump()
+ CheckScreendump
CheckRunVimInTerminal
let lines =<< trim END
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index fbd128a..1d5de42 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
Binary files differ
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 6980913..d0bedf2 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -4174,6 +4174,7 @@
endfunc
def Run_test_no_redraw_when_restoring_cpo()
+ CheckScreendump
var lines =<< trim END
vim9script
export def Func()
@@ -4205,6 +4206,7 @@
endfunc
def Run_test_reject_declaration()
+ CheckScreendump
var buf = g:RunVimInTerminal('', {'rows': 6})
term_sendkeys(buf, ":vim9cmd var x: number\<CR>")
g:VerifyScreenDump(buf, 'Test_vim9_reject_declaration_1', {})
@@ -4831,11 +4833,13 @@
enddef
func Test_misplaced_type()
+ CheckScreendump
CheckRunVimInTerminal
call Run_Test_misplaced_type()
endfunc
def Run_Test_misplaced_type()
+ CheckScreendump
writefile(['let g:somevar = "asdf"'], 'XTest_misplaced_type', 'D')
var buf = g:RunVimInTerminal('-S XTest_misplaced_type', {'rows': 6})
term_sendkeys(buf, ":vim9cmd echo islocked('somevar: string')\<CR>")
diff --git a/src/testdir/test_xxd.vim b/src/testdir/test_xxd.vim
index 690c8da..5d739e0 100644
--- a/src/testdir/test_xxd.vim
+++ b/src/testdir/test_xxd.vim
@@ -667,6 +667,7 @@
let buf = RunVimInTerminal('', #{rows: 20, cmd: 'sh'})
call term_sendkeys(buf, s:xxd_cmd .. " -R never < XXDfile_colors\<cr>")
call TermWait(buf)
+ redraw
call VerifyScreenDump(buf, 'Test_xxd_color_0', {})
call TermWait(buf)
diff --git a/src/version.c b/src/version.c
index 4126743..398f25c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1370,
+/**/
1369,
/**/
1368,