neovim/test/old/testdir/test_goto.vim
zeertzjq eb8a3e0575
vim-patch:9.1.0114: Setting some options may change curswant (#27514)
Problem:  Setting some options changes curswant unnecessarily.
Solution: Add a P_HLONLY flag that prevents changing curswant.
          (zeertzjq)

closes: vim/vim#14044

fcaed6a70f
2024-02-18 17:20:49 +08:00

448 lines
7.5 KiB
VimL

" Test commands that jump somewhere.
" Create a new buffer using "lines" and place the cursor on the word after the
" first occurrence of return and invoke "cmd". The cursor should now be
" positioned at the given line and col.
func XTest_goto_decl(cmd, lines, line, col)
new
call setline(1, a:lines)
/return/
normal! W
execute 'norm! ' . a:cmd
call assert_equal(a:line, line('.'))
call assert_equal(a:col, col('.'))
quit!
endfunc
func Test_gD()
let lines =<< trim [CODE]
int x;
int func(void)
{
return x;
}
[CODE]
call XTest_goto_decl('gD', lines, 1, 5)
endfunc
func Test_gD_too()
let lines =<< trim [CODE]
Filename x;
int Filename
int func() {
Filename x;
return x;
[CODE]
call XTest_goto_decl('gD', lines, 1, 10)
endfunc
func Test_gD_comment()
let lines =<< trim [CODE]
/* int x; */
int x;
int func(void)
{
return x;
}
[CODE]
call XTest_goto_decl('gD', lines, 2, 5)
endfunc
func Test_gD_inline_comment()
let lines =<< trim [CODE]
int y /* , x */;
int x;
int func(void)
{
return x;
}
[CODE]
call XTest_goto_decl('gD', lines, 2, 5)
endfunc
func Test_gD_string()
let lines =<< trim [CODE]
char *s[] = "x";
int x = 1;
int func(void)
{
return x;
}
[CODE]
call XTest_goto_decl('gD', lines, 2, 5)
endfunc
func Test_gD_string_same_line()
let lines =<< trim [CODE]
char *s[] = "x", int x = 1;
int func(void)
{
return x;
}
[CODE]
call XTest_goto_decl('gD', lines, 1, 22)
endfunc
func Test_gD_char()
let lines =<< trim [CODE]
char c = 'x';
int x = 1;
int func(void)
{
return x;
}
[CODE]
call XTest_goto_decl('gD', lines, 2, 5)
endfunc
func Test_gd()
let lines =<< trim [CODE]
int x;
int func(int x)
{
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 3, 14)
endfunc
" Using gd to jump to a declaration in a fold
func Test_gd_with_fold()
new
let lines =<< trim END
#define ONE 1
#define TWO 2
#define THREE 3
TWO
END
call setline(1, lines)
1,3fold
call feedkeys('Ggd', 'xt')
call assert_equal(2, line('.'))
call assert_equal(-1, foldclosedend(2))
bw!
endfunc
func Test_gd_not_local()
let lines =<< trim [CODE]
int func1(void)
{
return x;
}
int func2(int x)
{
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 3, 10)
endfunc
func Test_gd_kr_style()
let lines =<< trim [CODE]
int func(x)
int x;
{
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 2, 7)
endfunc
func Test_gd_missing_braces()
let lines =<< trim [CODE]
def func1(a)
a + 1
end
a = 1
def func2()
return a
end
[CODE]
call XTest_goto_decl('gd', lines, 1, 11)
endfunc
func Test_gd_comment()
let lines =<< trim [CODE]
int func(void)
{
/* int x; */
int x;
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 4, 7)
endfunc
func Test_gd_comment_in_string()
let lines =<< trim [CODE]
int func(void)
{
char *s ="//"; int x;
int x;
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 3, 22)
endfunc
func Test_gd_string_in_comment()
set comments=
let lines =<< trim [CODE]
int func(void)
{
/* " */ int x;
int x;
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 3, 15)
set comments&
endfunc
func Test_gd_inline_comment()
let lines =<< trim [CODE]
int func(/* x is an int */ int x)
{
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 1, 32)
endfunc
func Test_gd_inline_comment_only()
let lines =<< trim [CODE]
int func(void) /* one lonely x */
{
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 3, 10)
endfunc
func Test_gd_inline_comment_body()
let lines =<< trim [CODE]
int func(void)
{
int y /* , x */;
for (/* int x = 0 */; y < 2; y++);
int x = 0;
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 7, 7)
endfunc
func Test_gd_trailing_multiline_comment()
let lines =<< trim [CODE]
int func(int x) /* x is an int */
{
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 1, 14)
endfunc
func Test_gd_trailing_comment()
let lines =<< trim [CODE]
int func(int x) // x is an int
{
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 1, 14)
endfunc
func Test_gd_string()
let lines =<< trim [CODE]
int func(void)
{
char *s = "x";
int x = 1;
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 4, 7)
endfunc
func Test_gd_string_only()
let lines =<< trim [CODE]
int func(void)
{
char *s = "x";
return x;
}
[CODE]
call XTest_goto_decl('gd', lines, 5, 10)
endfunc
" Check that setting some options does not change curswant
func Test_set_options_keep_col()
new
call setline(1, ['long long long line', 'short line'])
normal ggfi
let pos = getcurpos()
normal j
set invhlsearch spell spelllang=en,cjk spelloptions=camel textwidth=80
set cursorline cursorcolumn cursorlineopt=line colorcolumn=+1
set background=dark
set background=light
normal k
call assert_equal(pos, getcurpos())
bwipe!
set hlsearch& spell& spelllang& spelloptions& textwidth&
set cursorline& cursorcolumn& cursorlineopt& colorcolumn&
set background&
endfunc
func Test_gd_local_block()
let lines =<< trim [CODE]
int main()
{
char *a = "NOT NULL";
if(a)
{
char *b = a;
printf("%s\n", b);
}
else
{
char *b = "NULL";
return b;
}
return 0;
}
[CODE]
call XTest_goto_decl('1gd', lines, 11, 11)
endfunc
func Test_motion_if_elif_else_endif()
new
let lines =<< trim END
/* Test pressing % on #if, #else #elsif and #endif,
* with nested #if
*/
#if FOO
/* ... */
# if BAR
/* ... */
# endif
#elif BAR
/* ... */
#else
/* ... */
#endif
#define FOO 1
END
call setline(1, lines)
/#if FOO
norm %
call assert_equal([9, 1], getpos('.')[1:2])
norm %
call assert_equal([11, 1], getpos('.')[1:2])
norm %
call assert_equal([13, 1], getpos('.')[1:2])
norm %
call assert_equal([4, 1], getpos('.')[1:2])
/# if BAR
norm $%
call assert_equal([8, 1], getpos('.')[1:2])
norm $%
call assert_equal([6, 1], getpos('.')[1:2])
" Test for [# and ]# command
call cursor(5, 1)
normal [#
call assert_equal([4, 1], getpos('.')[1:2])
call cursor(5, 1)
normal ]#
call assert_equal([9, 1], getpos('.')[1:2])
call cursor(10, 1)
normal [#
call assert_equal([9, 1], getpos('.')[1:2])
call cursor(10, 1)
normal ]#
call assert_equal([11, 1], getpos('.')[1:2])
" Finding a match before the first line or after the last line should fail
normal gg
call assert_beeps('normal [#')
normal G
call assert_beeps('normal ]#')
" Finding a match for a macro definition (#define) should fail
normal G
call assert_beeps('normal %')
bw!
endfunc
func Test_motion_c_comment()
new
a
/*
* Test pressing % on beginning/end
* of C comments.
*/
/* Another comment */
.
norm gg0%
call assert_equal([4, 3], getpos('.')[1:2])
norm %
call assert_equal([1, 1], getpos('.')[1:2])
norm gg0l%
call assert_equal([4, 3], getpos('.')[1:2])
norm h%
call assert_equal([1, 1], getpos('.')[1:2])
norm G^
norm %
call assert_equal([5, 21], getpos('.')[1:2])
norm %
call assert_equal([5, 1], getpos('.')[1:2])
bw!
endfunc
" vim: shiftwidth=2 sts=2 expandtab