annotate src/testdir/test_expand.vim @ 33811:06219b3bdaf3 v9.0.2121

patch 9.0.2121: [security]: use-after-free in ex_substitute Commit: https://github.com/vim/vim/commit/26c11c56888d01e298cd8044caf860f3c26f57bb Author: Christian Brabandt <cb@256bit.org> Date: Wed Nov 22 21:26:41 2023 +0100 patch 9.0.2121: [security]: use-after-free in ex_substitute Problem: [security]: use-after-free in ex_substitute Solution: always allocate memory closes: #13552 A recursive :substitute command could cause a heap-use-after free in Vim (CVE-2023-48706). The whole reproducible test is a bit tricky, I can only reproduce this reliably when no previous substitution command has been used yet (which is the reason, the test needs to run as first one in the test_substitute.vim file) and as a combination of the `:~` command together with a :s command that contains the special substitution atom `~\=` which will make use of a sub-replace special atom and calls a vim script function. There was a comment in the existing :s code, that already makes the `sub` variable allocate memory so that a recursive :s call won't be able to cause any issues here, so this was known as a potential problem already. But for the current test-case that one does not work, because the substitution does not start with `\=` but with `~\=` (and since there does not yet exist a previous substitution atom, Vim will simply increment the `sub` pointer (which then was not allocated dynamically) and later one happily use a sub-replace special expression (which could then free the `sub` var). The following commit fixes this, by making the sub var always using allocated memory, which also means we need to free the pointer whenever we leave the function. Since sub is now always an allocated variable, we also do no longer need the sub_copy variable anymore, since this one was used to indicated when sub pointed to allocated memory (and had therefore to be freed on exit) and when not. Github Security Advisory: https://github.com/vim/vim/security/advisories/GHSA-c8qm-x72m-q53q Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Wed, 22 Nov 2023 22:15:05 +0100
parents dbec60b8c253
children 5397ce113043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7617
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
1 " Test for expanding file names
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
2
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
3 source shared.vim
26183
9865f996a3c0 patch 8.2.3623: "$*" is expanded to "nonomatch"
Bram Moolenaar <Bram@vim.org>
parents: 19932
diff changeset
4 source check.vim
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
5
7617
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
6 func Test_with_directories()
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
7 call mkdir('Xdir1')
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
8 call mkdir('Xdir2')
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
9 call mkdir('Xdir3')
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
10 cd Xdir3
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
11 call mkdir('Xdir4')
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
12 cd ..
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
13
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
14 split Xdir1/file
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
15 call setline(1, ['a', 'b'])
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
16 w
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
17 w Xdir3/Xdir4/file
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
18 close
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
19
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
20 next Xdir?/*/file
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
21 call assert_equal('Xdir3/Xdir4/file', expand('%'))
7623
2720952e9acb commit https://github.com/vim/vim/commit/f60b796fa9870bdfc4cdeb91653bac041916077d
Christian Brabandt <cb@256bit.org>
parents: 7617
diff changeset
22 if has('unix')
2720952e9acb commit https://github.com/vim/vim/commit/f60b796fa9870bdfc4cdeb91653bac041916077d
Christian Brabandt <cb@256bit.org>
parents: 7617
diff changeset
23 next! Xdir?/*/nofile
2720952e9acb commit https://github.com/vim/vim/commit/f60b796fa9870bdfc4cdeb91653bac041916077d
Christian Brabandt <cb@256bit.org>
parents: 7617
diff changeset
24 call assert_equal('Xdir?/*/nofile', expand('%'))
2720952e9acb commit https://github.com/vim/vim/commit/f60b796fa9870bdfc4cdeb91653bac041916077d
Christian Brabandt <cb@256bit.org>
parents: 7617
diff changeset
25 endif
7643
2b2e90fcd72b commit https://github.com/vim/vim/commit/08b270a8a4544be9a7fecce311834fde2b457634
Christian Brabandt <cb@256bit.org>
parents: 7623
diff changeset
26 " Edit another file, on MS-Windows the swap file would be in use and can't
2b2e90fcd72b commit https://github.com/vim/vim/commit/08b270a8a4544be9a7fecce311834fde2b457634
Christian Brabandt <cb@256bit.org>
parents: 7623
diff changeset
27 " be deleted.
2b2e90fcd72b commit https://github.com/vim/vim/commit/08b270a8a4544be9a7fecce311834fde2b457634
Christian Brabandt <cb@256bit.org>
parents: 7623
diff changeset
28 edit foo
7617
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
29
7643
2b2e90fcd72b commit https://github.com/vim/vim/commit/08b270a8a4544be9a7fecce311834fde2b457634
Christian Brabandt <cb@256bit.org>
parents: 7623
diff changeset
30 call assert_equal(0, delete('Xdir1', 'rf'))
2b2e90fcd72b commit https://github.com/vim/vim/commit/08b270a8a4544be9a7fecce311834fde2b457634
Christian Brabandt <cb@256bit.org>
parents: 7623
diff changeset
31 call assert_equal(0, delete('Xdir2', 'rf'))
2b2e90fcd72b commit https://github.com/vim/vim/commit/08b270a8a4544be9a7fecce311834fde2b457634
Christian Brabandt <cb@256bit.org>
parents: 7623
diff changeset
32 call assert_equal(0, delete('Xdir3', 'rf'))
7617
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
33 endfunc
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
34
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
35 func Test_with_tilde()
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
36 let dir = getcwd()
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
37 call mkdir('Xdir ~ dir')
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
38 call assert_true(isdirectory('Xdir ~ dir'))
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
39 cd Xdir\ ~\ dir
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
40 call assert_true(getcwd() =~ 'Xdir \~ dir')
18568
26a04a556982 patch 8.1.2278: using "cd" with "exe" may fail
Bram Moolenaar <Bram@vim.org>
parents: 17849
diff changeset
41 call chdir(dir)
7617
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
42 call delete('Xdir ~ dir', 'd')
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
43 call assert_false(isdirectory('Xdir ~ dir'))
80bc36419c21 commit https://github.com/vim/vim/commit/58adb14739fa240ca6020cede9ab1f1cb07bd90a
Christian Brabandt <cb@256bit.org>
parents:
diff changeset
44 endfunc
14393
c62601adad69 patch 8.1.0211: expanding a file name "~" results in $HOME
Christian Brabandt <cb@256bit.org>
parents: 7643
diff changeset
45
c62601adad69 patch 8.1.0211: expanding a file name "~" results in $HOME
Christian Brabandt <cb@256bit.org>
parents: 7643
diff changeset
46 func Test_expand_tilde_filename()
c62601adad69 patch 8.1.0211: expanding a file name "~" results in $HOME
Christian Brabandt <cb@256bit.org>
parents: 7643
diff changeset
47 split ~
31849
dbec60b8c253 patch 9.0.1257: code style is not check in test scripts
Bram Moolenaar <Bram@vim.org>
parents: 30405
diff changeset
48 call assert_equal('~', expand('%'))
14393
c62601adad69 patch 8.1.0211: expanding a file name "~" results in $HOME
Christian Brabandt <cb@256bit.org>
parents: 7643
diff changeset
49 call assert_notequal(expand('%:p'), expand('~/'))
31849
dbec60b8c253 patch 9.0.1257: code style is not check in test scripts
Bram Moolenaar <Bram@vim.org>
parents: 30405
diff changeset
50 call assert_match('\~', expand('%:p'))
14393
c62601adad69 patch 8.1.0211: expanding a file name "~" results in $HOME
Christian Brabandt <cb@256bit.org>
parents: 7643
diff changeset
51 bwipe!
c62601adad69 patch 8.1.0211: expanding a file name "~" results in $HOME
Christian Brabandt <cb@256bit.org>
parents: 7643
diff changeset
52 endfunc
17020
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
53
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
54 func Test_expandcmd()
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
55 let $FOO = 'Test'
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
56 call assert_equal('e x/Test/y', expandcmd('e x/$FOO/y'))
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
57 unlet $FOO
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
58
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
59 new
30051
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
60 edit Xpandfile1
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
61 call assert_equal('e Xpandfile1', expandcmd('e %'))
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
62 edit Xpandfile2
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
63 edit Xpandfile1
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
64 call assert_equal('e Xpandfile2', 'e #'->expandcmd())
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
65 edit Xpandfile2
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
66 edit Xpandfile3
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
67 edit Xpandfile4
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
68 let bnum = bufnr('Xpandfile2')
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
69 call assert_equal('e Xpandfile2', expandcmd('e #' . bnum))
17020
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
70 call setline('.', 'Vim!@#')
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
71 call assert_equal('e Vim', expandcmd('e <cword>'))
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
72 call assert_equal('e Vim!@#', expandcmd('e <cWORD>'))
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
73 enew!
30051
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
74 edit Xpandfile.java
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
75 call assert_equal('e Xpandfile.py', expandcmd('e %:r.py'))
17020
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
76 call assert_equal('make abc.java', expandcmd('make abc.%:e'))
30051
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
77 call assert_equal('make Xabc.java', expandcmd('make %:s?pandfile?abc?'))
17020
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
78 edit a1a2a3.rb
30051
13b02c1ea0f7 patch 9.0.0363: common names in test files causes tests to be flaky
Bram Moolenaar <Bram@vim.org>
parents: 28735
diff changeset
79 call assert_equal('make b1b2b3.rb a1a2a3 Xpandfile.o', expandcmd('make %:gs?a?b? %< #<.o'))
17020
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
80
28283
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
81 call assert_equal('make <afile>', expandcmd("make <afile>"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
82 call assert_equal('make <amatch>', expandcmd("make <amatch>"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
83 call assert_equal('make <abuf>', expandcmd("make <abuf>"))
17020
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
84 enew
28283
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
85 call assert_equal('make %', expandcmd("make %"))
19471
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
86 let $FOO="blue\tsky"
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
87 call setline(1, "$FOO")
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
88 call assert_equal("grep pat blue\tsky", expandcmd('grep pat <cfile>'))
19906
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
89
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
90 " Test for expression expansion `=
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
91 let $FOO= "blue"
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
92 call assert_equal("blue sky", expandcmd("`=$FOO .. ' sky'`"))
28307
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
93 let x = expandcmd("`=axbycz`")
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
94 call assert_equal('`=axbycz`', x)
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
95 call assert_fails('let x = expandcmd("`=axbycz`", #{errmsg: 1})', 'E121:')
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
96 let x = expandcmd("`=axbycz`", #{abc: []})
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
97 call assert_equal('`=axbycz`', x)
19906
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
98
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
99 " Test for env variable with spaces
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
100 let $FOO= "foo bar baz"
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
101 call assert_equal("e foo bar baz", expandcmd("e $FOO"))
031184ace7c5 patch 8.2.0509: various code is not properly tested.
Bram Moolenaar <Bram@vim.org>
parents: 19471
diff changeset
102
28307
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
103 if has('unix') && executable('bash')
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
104 " test for using the shell to expand a command argument.
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
105 " only bash supports the {..} syntax
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
106 set shell=bash
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
107 let x = expandcmd('{1..4}')
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
108 call assert_equal('{1..4}', x)
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
109 call assert_fails("let x = expandcmd('{1..4}', #{errmsg: v:true})", 'E77:')
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
110 let x = expandcmd('{1..4}', #{error: v:true})
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
111 call assert_equal('{1..4}', x)
425700af491b patch 8.2.4679: cannot have expandcmd() give an error message for mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28283
diff changeset
112 set shell&
28283
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
113 endif
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
114
19471
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
115 unlet $FOO
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
116 close!
17020
1841c03a9b5e patch 8.1.1510: a plugin cannot easily expand a command like done internally
Bram Moolenaar <Bram@vim.org>
parents: 14393
diff changeset
117 endfunc
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
118
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
119 " Test for expanding <sfile>, <slnum> and <sflnum> outside of sourcing a script
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
120 func Test_source_sfile()
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
121 let lines =<< trim [SCRIPT]
28283
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
122 :call assert_equal('<sfile>', expandcmd("<sfile>"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
123 :call assert_equal('<slnum>', expandcmd("<slnum>"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
124 :call assert_equal('<sflnum>', expandcmd("<sflnum>"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
125 :call assert_equal('edit <cfile>', expandcmd("edit <cfile>"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
126 :call assert_equal('edit #', expandcmd("edit #"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
127 :call assert_equal('edit #<2', expandcmd("edit #<2"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
128 :call assert_equal('edit <cword>', expandcmd("edit <cword>"))
2fd2ce8a556c patch 8.2.4667: expandcmd() fails on an error
Bram Moolenaar <Bram@vim.org>
parents: 26183
diff changeset
129 :call assert_equal('edit <cexpr>', expandcmd("edit <cexpr>"))
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
130 :call assert_fails('autocmd User MyCmd echo "<sfile>"', 'E498:')
28431
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
131 :
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
132 :call assert_equal('', expand('<script>'))
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
133 :verbose echo expand('<script>')
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
134 :call add(v:errors, v:errmsg)
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
135 :verbose echo expand('<sfile>')
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
136 :call add(v:errors, v:errmsg)
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
137 :call writefile(v:errors, 'Xresult')
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
138 :qall!
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
139 [SCRIPT]
30405
ea38db8639eb patch 9.0.0538: manually deleting test temp files
Bram Moolenaar <Bram@vim.org>
parents: 30051
diff changeset
140 call writefile(lines, 'Xscript', 'D')
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
141 if RunVim([], [], '--clean -s Xscript')
28431
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
142 call assert_equal([
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
143 \ 'E1274: No script file name to substitute for "<script>"',
28735
c428a4e53b9c patch 8.2.4892: test failures because of changed error messages
Bram Moolenaar <Bram@vim.org>
parents: 28449
diff changeset
144 \ 'E498: No :source file name to substitute for "<sfile>"'],
28431
4fbdd4ce9edb patch 8.2.4740: when expand() fails there is no error message
Bram Moolenaar <Bram@vim.org>
parents: 28403
diff changeset
145 \ readfile('Xresult'))
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
146 endif
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
147 call delete('Xresult')
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
148 endfunc
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
149
19471
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
150 " Test for expanding filenames multiple times in a command line
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
151 func Test_expand_filename_multicmd()
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
152 edit foo
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
153 call setline(1, 'foo!')
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
154 new
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
155 call setline(1, 'foo!')
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
156 new <cword> | new <cWORD>
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
157 call assert_equal(4, winnr('$'))
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
158 call assert_equal('foo!', bufname(winbufnr(1)))
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
159 call assert_equal('foo', bufname(winbufnr(2)))
19932
2c4d9ca33769 patch 8.2.0522: several errors are not tested for
Bram Moolenaar <Bram@vim.org>
parents: 19906
diff changeset
160 call assert_fails('e %:s/.*//', 'E500:')
19471
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
161 %bwipe!
cb73f4ae6b7c patch 8.2.0293: various Ex commands not sufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19425
diff changeset
162 endfunc
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
163
26183
9865f996a3c0 patch 8.2.3623: "$*" is expanded to "nonomatch"
Bram Moolenaar <Bram@vim.org>
parents: 19932
diff changeset
164 func Test_expandcmd_shell_nonomatch()
9865f996a3c0 patch 8.2.3623: "$*" is expanded to "nonomatch"
Bram Moolenaar <Bram@vim.org>
parents: 19932
diff changeset
165 CheckNotMSWindows
9865f996a3c0 patch 8.2.3623: "$*" is expanded to "nonomatch"
Bram Moolenaar <Bram@vim.org>
parents: 19932
diff changeset
166 call assert_equal('$*', expandcmd('$*'))
9865f996a3c0 patch 8.2.3623: "$*" is expanded to "nonomatch"
Bram Moolenaar <Bram@vim.org>
parents: 19932
diff changeset
167 endfunc
9865f996a3c0 patch 8.2.3623: "$*" is expanded to "nonomatch"
Bram Moolenaar <Bram@vim.org>
parents: 19932
diff changeset
168
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
169 func Test_expand_script_source()
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
170 let lines0 =<< trim [SCRIPT]
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
171 call extend(g:script_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
172 so Xscript1
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
173 func F0()
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
174 call extend(g:func_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
175 endfunc
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
176
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
177 au User * call extend(g:au_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
178 [SCRIPT]
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
179
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
180 let lines1 =<< trim [SCRIPT]
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
181 call extend(g:script_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
182 so Xscript2
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
183 func F1()
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
184 call extend(g:func_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
185 endfunc
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
186
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
187 au User * call extend(g:au_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
188 [SCRIPT]
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
189
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
190 let lines2 =<< trim [SCRIPT]
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
191 call extend(g:script_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
192 func F2()
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
193 call extend(g:func_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
194 endfunc
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
195
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
196 au User * call extend(g:au_level, [expand('<script>:t')])
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
197 [SCRIPT]
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
198
30405
ea38db8639eb patch 9.0.0538: manually deleting test temp files
Bram Moolenaar <Bram@vim.org>
parents: 30051
diff changeset
199 call writefile(lines0, 'Xscript0', 'D')
ea38db8639eb patch 9.0.0538: manually deleting test temp files
Bram Moolenaar <Bram@vim.org>
parents: 30051
diff changeset
200 call writefile(lines1, 'Xscript1', 'D')
ea38db8639eb patch 9.0.0538: manually deleting test temp files
Bram Moolenaar <Bram@vim.org>
parents: 30051
diff changeset
201 call writefile(lines2, 'Xscript2', 'D')
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
202
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
203 " Check the expansion of <script> at different levels.
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
204 let g:script_level = []
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
205 let g:func_level = []
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
206 let g:au_level = []
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
207
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
208 so Xscript0
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
209 call F0()
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
210 call F1()
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
211 call F2()
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
212 doautocmd User
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
213
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
214 call assert_equal(['Xscript0', 'Xscript1', 'Xscript2'], g:script_level)
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
215 call assert_equal(['Xscript0', 'Xscript1', 'Xscript2'], g:func_level)
28449
80ed5ad30d28 patch 8.2.4749: <script> is not expanded in autocmd context
Bram Moolenaar <Bram@vim.org>
parents: 28431
diff changeset
216 call assert_equal(['Xscript2', 'Xscript1', 'Xscript0'], g:au_level)
28403
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
217
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
218 unlet g:script_level g:func_level
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
219 delfunc F0
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
220 delfunc F1
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
221 delfunc F2
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
222 endfunc
2655935b5ccc patch 8.2.4726: cannot use expand() to get the script name
Bram Moolenaar <Bram@vim.org>
parents: 28307
diff changeset
223
19425
67fbe280a502 patch 8.2.0270: some code not covered by tests
Bram Moolenaar <Bram@vim.org>
parents: 18568
diff changeset
224 " vim: shiftwidth=2 sts=2 expandtab