2020-01-26 15:56:19 +01:00
" Test various aspects of the Vim9 script language.
2020-01-26 16:50:05 +01:00
source check .vim
2020-06-16 23:18:51 +02:00
source term_util .vim
2022-01-29 21:45:34 +00:00
import './vim9.vim' as v9
2021-03-10 13:40:08 +01:00
source screendump .vim
2022-01-07 21:39:52 +00:00
source shared .vim
2020-01-26 15:56:19 +01:00
2022-01-01 12:17:00 +00:00
def Test_vim9script_feature ( )
# example from the help , here the feature is always present
var lines = < < trim END
" old style comment
if ! has ( 'vim9script' )
" legacy commands would go here
finish
endif
vim9script
# Vim9 script commands go here
g :didit = true
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2022-01-01 12:17:00 +00:00
assert_equal ( true , g :didit )
unlet g :didit
enddef
2020-08-20 23:04:06 +02:00
def Test_range_only ( )
new
setline ( 1 , ['blah' , 'Blah' ])
:/Blah/
assert_equal ( 2 , getcurpos ( ) [1 ])
2020-08-23 21:06:02 +02:00
bwipe !
# without range commands use current line
new
setline ( 1 , ['one' , 'two' , 'three' ])
:2
print
2022-01-29 21:45:34 +00:00
assert_equal ( 'two' , g :Screenline ( &lines ) )
2020-08-23 21:06:02 +02:00
:3
list
2022-01-29 21:45:34 +00:00
assert_equal ( 'three$' , g :Screenline ( &lines ) )
2021-02-15 21:30:30 +01:00
# missing command does not print the line
var lines = < < trim END
vim9script
:1 |
2022-01-29 21:45:34 +00:00
assert_equal ( 'three$' , g :Screenline ( &lines ) )
2021-02-15 21:30:30 +01:00
:|
2022-01-29 21:45:34 +00:00
assert_equal ( 'three$' , g :Screenline ( &lines ) )
2021-02-15 21:30:30 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-02-15 21:30:30 +01:00
2020-08-23 21:06:02 +02:00
bwipe !
2020-12-14 18:31:27 +01:00
2022-02-17 19:44:07 +00:00
lines = < < trim END
set cpo + = -
:1 , 999
END
v9 .CheckDefExecAndScriptFailure ( lines , 'E16:' , 2 )
set cpo &vim
v9 .CheckDefExecAndScriptFailure ( [":'x" ], 'E20:' , 1 )
2020-12-14 18:31:27 +01:00
# won 't generate anything
if false
:123
endif
2020-08-20 23:04:06 +02:00
enddef
2020-05-15 23:36:40 +02:00
let g :alist = [7 ]
let g :astring = 'text'
2020-07-17 23:03:17 +02:00
let g :anumber = 123
2020-02-06 13:15:52 +01:00
2020-04-27 22:47:51 +02:00
def Test_delfunction ( )
2020-07-17 20:36:00 +02:00
# Check function is defined in script namespace
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-27 22:47:51 +02:00
'vim9script' ,
'func CheckMe()' ,
' return 123' ,
'endfunc' ,
2022-02-12 19:52:25 +00:00
'func DoTest()' ,
' call assert_equal(123, s:CheckMe())' ,
'endfunc' ,
'DoTest()' ,
2020-04-27 22:47:51 +02:00
])
2020-07-17 20:36:00 +02:00
# Check function in script namespace cannot be deleted
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-27 22:47:51 +02:00
'vim9script' ,
'func DeleteMe1()' ,
'endfunc' ,
'delfunction DeleteMe1' ,
], 'E1084:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-27 22:47:51 +02:00
'vim9script' ,
'func DeleteMe2()' ,
'endfunc' ,
'def DoThat()' ,
' delfunction DeleteMe2' ,
'enddef' ,
'DoThat()' ,
], 'E1084:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-27 22:47:51 +02:00
'vim9script' ,
'def DeleteMe3()' ,
'enddef' ,
'delfunction DeleteMe3' ,
], 'E1084:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-27 22:47:51 +02:00
'vim9script' ,
'def DeleteMe4()' ,
'enddef' ,
'def DoThat()' ,
' delfunction DeleteMe4' ,
'enddef' ,
'DoThat()' ,
], 'E1084:' )
2020-07-25 15:41:11 +02:00
# Check that global :def function can be replaced and deleted
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-07-25 15:41:11 +02:00
vim9script
def g :Global ( ) : string
return "yes"
enddef
assert_equal ( "yes" , g :Global ( ) )
def ! g :Global ( ) : string
return "no"
enddef
assert_equal ( "no" , g :Global ( ) )
delfunc g :Global
assert_false ( exists ( '*g:Global' ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-07-25 15:41:11 +02:00
# Check that global function can be replaced by a :def function and deleted
lines = < < trim END
vim9script
func g :Global ( )
return "yes"
endfunc
assert_equal ( "yes" , g :Global ( ) )
def ! g :Global ( ) : string
return "no"
enddef
assert_equal ( "no" , g :Global ( ) )
delfunc g :Global
assert_false ( exists ( '*g:Global' ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-07-25 15:41:11 +02:00
# Check that global :def function can be replaced by a function and deleted
lines = < < trim END
vim9script
def g :Global ( ) : string
return "yes"
enddef
assert_equal ( "yes" , g :Global ( ) )
func ! g :Global ( )
return "no"
endfunc
assert_equal ( "no" , g :Global ( ) )
delfunc g :Global
assert_false ( exists ( '*g:Global' ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-04-27 22:47:51 +02:00
enddef
2020-09-14 17:04:31 +02:00
def Test_wrong_type ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var name: list<nothing>' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: list<list<nothing>>' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: dict<nothing>' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: dict<dict<nothing>>' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: dict<number' ], 'E1009:' )
v9 .CheckDefFailure ( ['var name: dict<list<number>' ], 'E1009:' )
v9 .CheckDefFailure ( ['var name: ally' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: bram' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: cathy' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: dom' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: freddy' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: john' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: larry' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: ned' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: pam' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: sam' ], 'E1010:' )
v9 .CheckDefFailure ( ['var name: vim' ], 'E1010:' )
v9 .CheckDefFailure ( ['var Ref: number' , 'Ref()' ], 'E1085:' )
v9 .CheckDefFailure ( ['var Ref: string' , 'var res = Ref()' ], 'E1085:' )
2020-09-14 17:04:31 +02:00
enddef
2022-02-12 19:52:25 +00:00
def Test_script_namespace ( )
# defining a function or variable with s : is not allowed
var lines = < < trim END
vim9script
def s :Function ( )
enddef
END
v9 .CheckScriptFailure ( lines , 'E1268:' )
for decl in ['var' , 'const' , 'final' ]
lines = < < trim END
vim9script
var s :var = 'var'
END
v9 .CheckScriptFailure ( [
'vim9script' ,
decl .. ' s:var = "var"' ,
], 'E1268:' )
endfor
# Calling a function or using a variable with s : is not allowed at script
# level
lines = < < trim END
vim9script
def Function ( )
enddef
s :Function ( )
END
v9 .CheckScriptFailure ( lines , 'E1268:' )
lines = < < trim END
vim9script
def Function ( )
enddef
call s :Function ( )
END
v9 .CheckScriptFailure ( lines , 'E1268:' )
lines = < < trim END
vim9script
var var = 'var'
echo s :var
END
v9 .CheckScriptFailure ( lines , 'E1268:' )
enddef
2020-10-08 21:16:42 +02:00
def Test_script_wrong_type ( )
var lines = < < trim END
vim9script
2022-02-12 19:52:25 +00:00
var dict : dict < string >
dict ['a' ] = ['x' ]
2020-10-08 21:16:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1012: Type mismatch; expected string but got list<string>' , 3 )
2020-10-08 21:16:42 +02:00
enddef
2020-09-14 17:04:31 +02:00
def Test_const ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['final name = 234' , 'name = 99' ], 'E1018:' )
v9 .CheckDefFailure ( ['final one = 234' , 'var one = 99' ], 'E1017:' )
v9 .CheckDefFailure ( ['final list = [1, 2]' , 'var list = [3, 4]' ], 'E1017:' )
v9 .CheckDefFailure ( ['final two' ], 'E1125:' )
v9 .CheckDefFailure ( ['final &option' ], 'E996:' )
2020-09-14 18:15:09 +02:00
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-09-26 15:09:30 +02:00
final list = [1 , 2 , 3 ]
2020-09-14 18:15:09 +02:00
list [0 ] = 4
2020-09-14 21:39:44 +02:00
list - > assert_equal ( [4 , 2 , 3 ])
2020-09-26 15:09:30 +02:00
const other = [5 , 6 , 7 ]
2020-09-14 21:39:44 +02:00
other - > assert_equal ( [5 , 6 , 7 ])
2020-09-14 22:28:30 +02:00
2020-09-27 15:19:27 +02:00
var varlist = [7 , 8 ]
2020-09-26 15:09:30 +02:00
const constlist = [1 , varlist , 3 ]
2020-09-14 22:28:30 +02:00
varlist [0 ] = 77
2021-08-03 21:16:18 +02:00
constlist [1 ][1 ] = 88
2020-09-27 15:19:27 +02:00
var cl = constlist [1 ]
2020-09-14 22:28:30 +02:00
cl [1 ] = 88
constlist - > assert_equal ( [1 , [77 , 88 ], 3 ])
2020-12-02 17:36:54 +01:00
var vardict = {five : 5 , six : 6 }
const constdict = {one : 1 , two : vardict , three : 3 }
2020-09-14 22:28:30 +02:00
vardict ['five' ] = 55
2021-08-03 21:16:18 +02:00
constdict ['two' ]['six' ] = 66
2020-09-27 15:19:27 +02:00
var cd = constdict ['two' ]
2020-09-14 22:28:30 +02:00
cd ['six' ] = 66
2020-12-02 17:36:54 +01:00
constdict - > assert_equal ( {one : 1 , two : {five : 55 , six : 66 }, three : 3 })
2020-09-14 18:15:09 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-09-14 17:04:31 +02:00
enddef
2020-01-26 15:56:19 +01:00
2020-09-14 21:39:44 +02:00
def Test_const_bang ( )
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-09-26 15:09:30 +02:00
const var = 234
2020-09-14 21:39:44 +02:00
var = 99
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1018:' , 2 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E46:' , 3 )
2020-09-14 21:39:44 +02:00
lines = < < trim END
2020-09-26 15:09:30 +02:00
const ll = [2 , 3 , 4 ]
2020-09-14 21:39:44 +02:00
ll [0 ] = 99
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1119:' , 2 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E741:' , 3 )
2020-09-14 21:39:44 +02:00
lines = < < trim END
2020-09-26 15:09:30 +02:00
const ll = [2 , 3 , 4 ]
2020-09-14 21:39:44 +02:00
ll [3 ] = 99
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1118:' , 2 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E684:' , 3 )
2020-09-14 21:39:44 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
const dd = {one : 1 , two : 2 }
2020-09-14 21:39:44 +02:00
dd ["one" ] = 99
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1121:' , 2 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E741:' , 3 )
2020-09-14 21:39:44 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
const dd = {one : 1 , two : 2 }
2020-09-14 21:39:44 +02:00
dd ["three" ] = 99
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1120:' )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E741:' , 3 )
2020-09-14 21:39:44 +02:00
enddef
2020-06-22 23:02:51 +02:00
def Test_range_no_colon ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['%s/a/b/' ], 'E1050:' )
v9 .CheckDefFailure ( ['+ s/a/b/' ], 'E1050:' )
v9 .CheckDefFailure ( ['- s/a/b/' ], 'E1050:' )
v9 .CheckDefFailure ( ['. s/a/b/' ], 'E1050:' )
2020-06-22 23:02:51 +02:00
enddef
2020-01-26 15:56:19 +01:00
def Test_block ( )
2020-09-27 15:19:27 +02:00
var outer = 1
2020-01-26 15:56:19 +01:00
{
2020-09-27 15:19:27 +02:00
var inner = 2
2020-01-26 15:56:19 +01:00
assert_equal ( 1 , outer )
assert_equal ( 2 , inner )
}
assert_equal ( 1 , outer )
2021-02-27 22:36:43 +01:00
{| echo 'yes' | }
2020-01-26 15:56:19 +01:00
enddef
2020-09-14 17:04:31 +02:00
def Test_block_failure ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['{' , 'var inner = 1' , '}' , 'echo inner' ], 'E1001:' )
v9 .CheckDefFailure ( ['}' ], 'E1025:' )
v9 .CheckDefFailure ( ['{' , 'echo 1' ], 'E1026:' )
2020-09-14 17:04:31 +02:00
enddef
2020-01-26 15:56:19 +01:00
2020-10-15 12:46:44 +02:00
def Test_block_local_vars ( )
var lines = < < trim END
vim9script
2020-10-15 20:42:20 +02:00
v :testing = 1
2020-10-15 12:46:44 +02:00
if true
2020-10-15 20:42:20 +02:00
var text = ['hello' ]
def SayHello ( ) : list < string >
2020-10-15 12:46:44 +02:00
return text
enddef
def SetText ( v : string )
2020-10-15 20:42:20 +02:00
text = [v ]
2020-10-15 12:46:44 +02:00
enddef
endif
if true
2020-10-15 20:42:20 +02:00
var text = ['again' ]
def SayAgain ( ) : list < string >
2020-10-15 12:46:44 +02:00
return text
enddef
endif
2020-10-15 20:42:20 +02:00
# test that the "text" variables are not cleaned up
test_garbagecollect_now ( )
2020-10-15 12:46:44 +02:00
defcompile
2020-10-15 20:42:20 +02:00
assert_equal ( ['hello' ], SayHello ( ) )
assert_equal ( ['again' ], SayAgain ( ) )
2020-10-15 12:46:44 +02:00
SetText ( 'foobar' )
2020-10-15 20:42:20 +02:00
assert_equal ( ['foobar' ], SayHello ( ) )
call writefile ( ['ok' ], 'Xdidit' )
qall !
2020-10-15 12:46:44 +02:00
END
2020-10-15 20:42:20 +02:00
# need to execute this with a separate Vim instance to avoid the current
# context gets garbage collected .
writefile ( lines , 'Xscript' )
2022-01-29 21:45:34 +00:00
g :RunVim ( [], [], '-S Xscript' )
2020-10-15 20:42:20 +02:00
assert_equal ( ['ok' ], readfile ( 'Xdidit' ) )
delete ( 'Xscript' )
delete ( 'Xdidit' )
2020-10-15 12:46:44 +02:00
enddef
2020-10-20 14:25:07 +02:00
def Test_block_local_vars_with_func ( )
var lines = < < trim END
vim9script
if true
var foo = 'foo'
if true
var bar = 'bar'
def Func ( ) : list < string >
return [foo , bar ]
enddef
endif
endif
# function is compiled here , after blocks have finished , can still access
# "foo" and "bar"
assert_equal ( ['foo' , 'bar' ], Func ( ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-10-20 14:25:07 +02:00
enddef
2021-08-01 21:19:43 +02:00
" legacy func for command that's defined later
2022-01-29 21:45:34 +00:00
func s :InvokeSomeCommand ( )
2021-08-01 21:19:43 +02:00
SomeCommand
endfunc
def Test_autocommand_block ( )
com SomeCommand {
g :someVar = 'some'
}
InvokeSomeCommand ( )
assert_equal ( 'some' , g :someVar )
delcommand SomeCommand
unlet g :someVar
enddef
def Test_command_block ( )
au BufNew *.xml {
g :otherVar = 'other'
}
split other .xml
assert_equal ( 'other' , g :otherVar )
bwipe !
au ! BufNew *.xml
unlet g :otherVar
enddef
2020-07-18 18:13:02 +02:00
func g :NoSuchFunc ( )
echo 'none'
endfunc
2021-01-11 20:17:34 +01:00
def Test_try_catch_throw ( )
2020-09-27 15:19:27 +02:00
var l = []
2020-04-16 22:10:49 +02:00
try # comment
2020-01-26 15:56:19 +01:00
add ( l , '1' )
throw 'wrong'
add ( l , '2' )
2020-04-16 22:10:49 +02:00
catch # comment
2020-01-26 15:56:19 +01:00
add ( l , v :exception )
2020-04-16 22:10:49 +02:00
finally # comment
2020-01-26 15:56:19 +01:00
add ( l , '3' )
2020-04-16 22:10:49 +02:00
endtry # comment
2020-01-26 15:56:19 +01:00
assert_equal ( ['1' , 'wrong' , '3' ], l )
2020-07-17 22:06:44 +02:00
2020-07-18 15:17:02 +02:00
l = []
try
try
add ( l , '1' )
throw 'wrong'
add ( l , '2' )
catch /right/
add ( l , v :exception )
endtry
catch /wrong/
add ( l , 'caught' )
2020-09-26 17:20:53 +02:00
fina
2020-07-18 15:17:02 +02:00
add ( l , 'finally' )
endtry
assert_equal ( ['1' , 'caught' , 'finally' ], l )
2020-09-27 15:19:27 +02:00
var n : number
2020-07-17 22:06:44 +02:00
try
n = l [3 ]
catch /E684:/
n = 99
endtry
assert_equal ( 99 , n )
2021-01-01 16:10:46 +01:00
var done = 'no'
if 0
try | catch | endtry
else
done = 'yes'
endif
assert_equal ( 'yes' , done )
done = 'no'
if 1
done = 'yes'
else
try | catch | endtry
done = 'never'
endif
assert_equal ( 'yes' , done )
if 1
else
try | catch /pat/ | endtry
try | catch /pat/
endtry
try
catch /pat/ | endtry
try
catch /pat/
endtry
endif
2020-07-17 22:06:44 +02:00
try
2020-08-16 17:33:35 +02:00
# string slice returns a string , not a number
2020-07-17 22:06:44 +02:00
n = g :astring [3 ]
2020-09-16 15:22:00 +02:00
catch /E1012:/
2020-07-17 22:06:44 +02:00
n = 77
endtry
assert_equal ( 77 , n )
try
n = l [g :astring ]
2020-09-16 15:22:00 +02:00
catch /E1012:/
2020-08-16 14:48:19 +02:00
n = 88
2020-07-17 22:06:44 +02:00
endtry
2020-08-16 14:48:19 +02:00
assert_equal ( 88 , n )
2020-07-17 22:06:44 +02:00
try
n = s :does_not_exist
2020-07-17 23:03:17 +02:00
catch /E121:/
n = 111
endtry
assert_equal ( 111 , n )
try
n = g :does_not_exist
2020-07-17 22:06:44 +02:00
catch /E121:/
n = 121
endtry
assert_equal ( 121 , n )
2020-12-02 17:36:54 +01:00
var d = {one : 1 }
2020-07-17 22:06:44 +02:00
try
n = d [g :astring ]
catch /E716:/
n = 222
endtry
assert_equal ( 222 , n )
2020-07-17 23:03:17 +02:00
try
n = - g :astring
2021-08-15 20:36:28 +02:00
catch /E1012:/
2020-07-17 23:03:17 +02:00
n = 233
endtry
assert_equal ( 233 , n )
try
n = + g :astring
2021-08-15 20:36:28 +02:00
catch /E1012:/
2020-07-17 23:03:17 +02:00
n = 244
endtry
assert_equal ( 244 , n )
try
n = + g :alist
2021-08-15 20:36:28 +02:00
catch /E1012:/
2020-07-17 23:03:17 +02:00
n = 255
endtry
assert_equal ( 255 , n )
2020-09-27 15:19:27 +02:00
var nd : dict < any >
2020-07-17 23:03:17 +02:00
try
2021-02-03 17:41:24 +01:00
nd = {[g :alist ]: 1 }
catch /E1105:/
2020-07-17 23:03:17 +02:00
n = 266
endtry
assert_equal ( 266 , n )
2021-12-01 17:38:01 +00:00
l = [1 , 2 , 3 ]
2020-07-17 23:03:17 +02:00
try
2021-12-01 17:38:01 +00:00
[n ] = l
2020-07-17 23:03:17 +02:00
catch /E1093:/
n = 277
endtry
assert_equal ( 277 , n )
2020-07-18 15:17:02 +02:00
try
&ts = g :astring
2020-09-16 15:22:00 +02:00
catch /E1012:/
2020-07-18 15:17:02 +02:00
n = 288
endtry
assert_equal ( 288 , n )
try
&backspace = 'asdf'
catch /E474:/
n = 299
endtry
assert_equal ( 299 , n )
l = [1 ]
try
l [3 ] = 3
catch /E684:/
n = 300
endtry
assert_equal ( 300 , n )
try
unlet g :does_not_exist
catch /E108:/
n = 322
endtry
assert_equal ( 322 , n )
try
2020-11-19 18:53:18 +01:00
d = {text : 1 , [g :astring ]: 2 }
2020-07-18 15:17:02 +02:00
catch /E721:/
n = 333
endtry
assert_equal ( 333 , n )
try
2022-01-29 21:45:34 +00:00
l = g :DeletedFunc ( )
2020-07-18 15:17:02 +02:00
catch /E933:/
n = 344
endtry
assert_equal ( 344 , n )
2020-07-18 18:13:02 +02:00
try
2021-07-25 15:57:32 +02:00
echo range ( 1 , 2 , 0 )
catch /E726:/
2020-07-18 18:13:02 +02:00
n = 355
endtry
assert_equal ( 355 , n )
2020-09-27 15:19:27 +02:00
var P = function ( 'g:NoSuchFunc' )
2020-07-18 18:13:02 +02:00
delfunc g :NoSuchFunc
try
echo P ( )
catch /E117:/
n = 366
endtry
assert_equal ( 366 , n )
try
echo g :NoSuchFunc ( )
catch /E117:/
n = 377
endtry
assert_equal ( 377 , n )
try
echo g :alist + 4
catch /E745:/
n = 388
endtry
assert_equal ( 388 , n )
try
echo 4 + g :alist
catch /E745:/
n = 399
endtry
assert_equal ( 399 , n )
try
echo g :alist .member
catch /E715:/
n = 400
endtry
assert_equal ( 400 , n )
try
echo d .member
catch /E716:/
n = 411
endtry
assert_equal ( 411 , n )
2021-02-12 21:32:47 +01:00
var counter = 0
for i in range ( 4 )
try
eval [][0 ]
catch
endtry
counter + = 1
endfor
assert_equal ( 4 , counter )
2021-02-21 21:32:45 +01:00
2021-07-20 19:18:44 +02:00
# no requirement for spaces before |
try | echo 0 | catch | endtry
2021-12-20 10:55:35 +00:00
# return in try with finally
def ReturnInTry ( ) : number
var ret = 4
try
return ret
catch /this/
return -1
catch /that/
return -1
finally
# changing ret has no effect
ret = 7
endtry
return -2
enddef
assert_equal ( 4 , ReturnInTry ( ) )
# return in catch with finally
def ReturnInCatch ( ) : number
var ret = 5
try
throw 'getout'
return -1
catch /getout/
# ret is evaluated here
return ret
finally
# changing ret later has no effect
ret = -3
endtry
return -2
enddef
assert_equal ( 5 , ReturnInCatch ( ) )
2021-02-21 21:32:45 +01:00
# return in finally after empty catch
def ReturnInFinally ( ) : number
try
finally
2021-12-20 10:55:35 +00:00
return 6
2021-02-21 21:32:45 +01:00
endtry
enddef
2021-12-20 10:55:35 +00:00
assert_equal ( 6 , ReturnInFinally ( ) )
2021-06-15 20:06:34 +02:00
var lines = < < trim END
vim9script
try
acos ( '0.5' )
- > setline ( 1 )
catch
g :caught = v :exception
endtry
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-07-27 22:00:44 +02:00
assert_match ( 'E1219: Float or Number required for argument 1' , g :caught )
2021-06-15 20:06:34 +02:00
unlet g :caught
2021-07-04 14:47:30 +02:00
# missing catch and /or finally
lines = < < trim END
vim9script
try
echo 'something'
endtry
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1032:' )
2021-08-07 13:26:53 +02:00
# skipping try - finally - endtry when try - finally - endtry is used in another block
lines = < < trim END
if v :true
try
finally
endtry
else
try
finally
endtry
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-18 15:17:02 +02:00
enddef
2022-03-03 15:11:20 +00:00
def Test_try_var_decl ( )
var lines = < < trim END
vim9script
try
var in_try = 1
assert_equal ( 1 , get ( s :, 'in_try' , -1 ) )
throw "getout"
catch
var in_catch = 2
assert_equal ( -1 , get ( s :, 'in_try' , -1 ) )
assert_equal ( 2 , get ( s :, 'in_catch' , -1 ) )
finally
var in_finally = 3
assert_equal ( -1 , get ( s :, 'in_try' , -1 ) )
assert_equal ( -1 , get ( s :, 'in_catch' , -1 ) )
assert_equal ( 3 , get ( s :, 'in_finally' , -1 ) )
endtry
assert_equal ( -1 , get ( s :, 'in_try' , -1 ) )
assert_equal ( -1 , get ( s :, 'in_catch' , -1 ) )
assert_equal ( -1 , get ( s :, 'in_finally' , -1 ) )
END
v9 .CheckScriptSuccess ( lines )
enddef
2022-01-12 16:18:18 +00:00
def Test_try_ends_in_return ( )
var lines = < < trim END
vim9script
def Foo ( ) : string
try
return 'foo'
catch
return 'caught'
endtry
enddef
assert_equal ( 'foo' , Foo ( ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2022-01-12 16:18:18 +00:00
lines = < < trim END
vim9script
def Foo ( ) : string
try
return 'foo'
catch
return 'caught'
endtry
echo 'notreached'
enddef
assert_equal ( 'foo' , Foo ( ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1095:' )
2022-01-12 16:18:18 +00:00
lines = < < trim END
vim9script
def Foo ( ) : string
try
return 'foo'
catch /x/
return 'caught'
endtry
enddef
assert_equal ( 'foo' , Foo ( ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1027:' )
2022-01-12 16:18:18 +00:00
lines = < < trim END
vim9script
def Foo ( ) : string
try
echo 'foo'
catch
echo 'caught'
finally
return 'done'
endtry
enddef
assert_equal ( 'done' , Foo ( ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2022-01-12 16:18:18 +00:00
enddef
2021-06-30 12:02:24 +02:00
def Test_try_in_catch ( )
var lines = < < trim END
vim9script
var seq = []
def DoIt ( )
try
seq - > add ( 'throw 1' )
eval [][0 ]
seq - > add ( 'notreached' )
catch
seq - > add ( 'catch' )
try
seq - > add ( 'throw 2' )
eval [][0 ]
seq - > add ( 'notreached' )
catch /nothing/
seq - > add ( 'notreached' )
endtry
seq - > add ( 'done' )
endtry
enddef
DoIt ( )
assert_equal ( ['throw 1' , 'catch' , 'throw 2' , 'done' ], seq )
END
enddef
2021-06-30 19:54:43 +02:00
def Test_error_in_catch ( )
var lines = < < trim END
try
eval [][0 ]
catch /E684:/
eval [][0 ]
endtry
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E684:' , 4 )
2021-06-30 19:54:43 +02:00
enddef
2021-03-14 12:13:33 +01:00
" :while at the very start of a function that :continue jumps to
2022-01-29 21:45:34 +00:00
def s :TryContinueFunc ( )
2021-03-14 12:13:33 +01:00
while g :Count < 2
g :sequence ..= 't'
try
echoerr 'Test'
catch
g :Count + = 1
g :sequence ..= 'c'
continue
endtry
g :sequence ..= 'e'
g :Count + = 1
endwhile
enddef
def Test_continue_in_try_in_while ( )
g :Count = 0
g :sequence = ''
TryContinueFunc ( )
assert_equal ( 'tctc' , g :sequence )
unlet g :Count
unlet g :sequence
enddef
2021-02-22 22:45:10 +01:00
def Test_nocatch_return_in_try ( )
# return in try block returns normally
def ReturnInTry ( ) : string
try
return '"some message"'
catch
endtry
return 'not reached'
enddef
exe 'echoerr ' .. ReturnInTry ( )
enddef
2021-01-17 19:20:32 +01:00
def Test_cnext_works_in_catch ( )
var lines = < < trim END
vim9script
2021-07-10 19:42:03 +02:00
au BufEnter * eval 1 + 2
2021-01-17 19:20:32 +01:00
writefile ( ['text' ], 'Xfile1' )
writefile ( ['text' ], 'Xfile2' )
var items = [
{lnum : 1 , filename : 'Xfile1' , valid : true },
{lnum : 1 , filename : 'Xfile2' , valid : true }
]
setqflist ( [], ' ' , {items : items })
cwindow
def CnextOrCfirst ( )
# if cnext fails , cfirst is used
try
cnext
catch
cfirst
endtry
enddef
CnextOrCfirst ( )
CnextOrCfirst ( )
writefile ( [getqflist ( {idx : 0 }) .idx ], 'Xresult' )
qall
END
writefile ( lines , 'XCatchCnext' )
2022-01-29 21:45:34 +00:00
g :RunVim ( [], [], '--clean -S XCatchCnext' )
2021-01-17 19:20:32 +01:00
assert_equal ( ['1' ], readfile ( 'Xresult' ) )
delete ( 'Xfile1' )
delete ( 'Xfile2' )
delete ( 'XCatchCnext' )
delete ( 'Xresult' )
enddef
2021-01-11 20:17:34 +01:00
def Test_throw_skipped ( )
if 0
throw dontgethere
endif
enddef
2021-01-14 21:47:06 +01:00
def Test_nocatch_throw_silenced ( )
var lines = < < trim END
vim9script
def Func ( )
throw 'error'
enddef
silent ! Func ( )
END
writefile ( lines , 'XthrowSilenced' )
source XthrowSilenced
delete ( 'XthrowSilenced' )
enddef
2020-07-18 15:17:02 +02:00
def DeletedFunc ( ) : list < any >
return ['delete me' ]
2020-01-26 15:56:19 +01:00
enddef
2020-07-18 15:17:02 +02:00
defcompile
delfunc DeletedFunc
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
def s :ThrowFromDef ( )
2020-04-23 17:07:30 +02:00
throw "getout" # comment
2020-02-19 17:06:11 +01:00
enddef
2022-01-29 21:45:34 +00:00
func s :CatchInFunc ( )
2020-02-19 17:06:11 +01:00
try
2022-01-29 21:45:34 +00:00
call s :ThrowFromDef ( )
2020-02-19 17:06:11 +01:00
catch
let g :thrown_func = v :exception
endtry
endfunc
2022-01-29 21:45:34 +00:00
def s :CatchInDef ( )
2020-02-19 17:06:11 +01:00
try
ThrowFromDef ( )
catch
g :thrown_def = v :exception
endtry
enddef
2022-01-29 21:45:34 +00:00
def s :ReturnFinally ( ) : string
2020-02-20 20:41:06 +01:00
try
return 'intry'
2020-09-26 17:20:53 +02:00
finall
2020-02-20 20:41:06 +01:00
g :in_finally = 'finally'
endtry
return 'end'
enddef
2020-02-19 17:06:11 +01:00
def Test_try_catch_nested ( )
CatchInFunc ( )
assert_equal ( 'getout' , g :thrown_func )
CatchInDef ( )
assert_equal ( 'getout' , g :thrown_def )
2020-02-20 20:41:06 +01:00
assert_equal ( 'intry' , ReturnFinally ( ) )
assert_equal ( 'finally' , g :in_finally )
2021-06-30 19:54:43 +02:00
var l = []
try
l - > add ( '1' )
throw 'bad'
l - > add ( 'x' )
catch /bad/
l - > add ( '2' )
try
l - > add ( '3' )
throw 'one'
l - > add ( 'x' )
catch /one/
l - > add ( '4' )
try
l - > add ( '5' )
throw 'more'
l - > add ( 'x' )
catch /more/
l - > add ( '6' )
endtry
endtry
endtry
assert_equal ( ['1' , '2' , '3' , '4' , '5' , '6' ], l )
2021-06-30 20:39:15 +02:00
l = []
try
try
l - > add ( '1' )
throw 'foo'
l - > add ( 'x' )
catch
l - > add ( '2' )
throw 'bar'
l - > add ( 'x' )
finally
l - > add ( '3' )
endtry
l - > add ( 'x' )
catch /bar/
l - > add ( '4' )
endtry
assert_equal ( ['1' , '2' , '3' , '4' ], l )
2020-02-20 20:41:06 +01:00
enddef
2022-01-29 21:45:34 +00:00
def s :TryOne ( ) : number
2020-09-16 22:29:52 +02:00
try
return 0
catch
endtry
return 0
enddef
2022-01-29 21:45:34 +00:00
def s :TryTwo ( n : number ) : string
2020-09-16 22:29:52 +02:00
try
2020-09-27 15:19:27 +02:00
var x = {}
2020-09-16 22:29:52 +02:00
catch
endtry
return 'text'
enddef
def Test_try_catch_twice ( )
assert_equal ( 'text' , TryOne ( ) - > TryTwo ( ) )
enddef
2020-02-20 20:41:06 +01:00
def Test_try_catch_match ( )
2020-09-27 15:19:27 +02:00
var seq = 'a'
2020-02-20 20:41:06 +01:00
try
throw 'something'
catch /nothing/
seq ..= 'x'
catch /some/
seq ..= 'b'
catch /asdf/
seq ..= 'x'
2020-04-02 21:13:25 +02:00
catch ?a \?sdf ?
seq ..= 'y'
2020-02-20 20:41:06 +01:00
finally
seq ..= 'c'
endtry
assert_equal ( 'abc' , seq )
2020-02-19 17:06:11 +01:00
enddef
2020-04-02 21:13:25 +02:00
def Test_try_catch_fails ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['catch' ], 'E603:' )
v9 .CheckDefFailure ( ['try' , 'echo 0' , 'catch' , 'catch' ], 'E1033:' )
v9 .CheckDefFailure ( ['try' , 'echo 0' , 'catch /pat' ], 'E1067:' )
v9 .CheckDefFailure ( ['finally' ], 'E606:' )
v9 .CheckDefFailure ( ['try' , 'echo 0' , 'finally' , 'echo 1' , 'finally' ], 'E607:' )
v9 .CheckDefFailure ( ['endtry' ], 'E602:' )
v9 .CheckDefFailure ( ['while 1' , 'endtry' ], 'E170:' )
v9 .CheckDefFailure ( ['for i in range(5)' , 'endtry' ], 'E170:' )
v9 .CheckDefFailure ( ['if 1' , 'endtry' ], 'E171:' )
v9 .CheckDefFailure ( ['try' , 'echo 1' , 'endtry' ], 'E1032:' )
2020-04-02 22:33:21 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['throw' ], 'E1143:' )
v9 .CheckDefFailure ( ['throw xxx' ], 'E1001:' )
2020-04-02 21:13:25 +02:00
enddef
2021-02-14 22:40:57 +01:00
def Try_catch_skipped ( )
var l = []
try
finally
endtry
if 1
else
try
endtry
endif
enddef
" The skipped try/endtry was updating the wrong instruction.
def Test_try_catch_skipped ( )
var instr = execute ( 'disassemble Try_catch_skipped' )
assert_match ( "NEWLIST size 0\n" , instr )
enddef
2022-02-12 14:23:17 +00:00
def Test_throw_line_number ( )
def Func ( )
eval 1 + 1
eval 2 + 2
throw 'exception'
enddef
try
Func ( )
catch /exception/
assert_match ( 'line 3' , v :throwpoint )
endtry
enddef
2021-02-14 22:40:57 +01:00
2020-06-30 20:55:15 +02:00
def Test_throw_vimscript ( )
2020-07-17 20:36:00 +02:00
# only checks line continuation
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-06-30 20:55:15 +02:00
vim9script
try
throw 'one'
.. 'two'
catch
assert_equal ( 'onetwo' , v :exception )
endtry
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-10-16 20:25:23 +02:00
lines = < < trim END
vim9script
2020-10-17 22:04:08 +02:00
@r = ''
2020-10-16 20:25:23 +02:00
def Func ( )
throw @r
enddef
var result = ''
try
Func ( )
catch /E1129:/
result = 'caught'
endtry
assert_equal ( 'caught' , result )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-06-30 20:55:15 +02:00
enddef
2020-08-12 16:38:10 +02:00
def Test_error_in_nested_function ( )
2021-02-14 13:17:22 +01:00
# an error in a nested :function aborts executing in the calling :def function
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-08-12 16:38:10 +02:00
vim9script
def Func ( )
Error ( )
g :test_var = 1
enddef
func Error ( ) abort
eval [][0 ]
endfunc
Func ( )
END
g :test_var = 0
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E684:' )
2020-08-12 16:38:10 +02:00
assert_equal ( 0 , g :test_var )
enddef
2021-04-28 20:40:44 +02:00
def Test_abort_after_error ( )
var lines = < < trim END
vim9script
while true
echo notfound
endwhile
g :gotthere = true
END
g :gotthere = false
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E121:' )
2021-04-28 20:40:44 +02:00
assert_false ( g :gotthere )
unlet g :gotthere
enddef
2020-06-30 21:18:36 +02:00
def Test_cexpr_vimscript ( )
2020-07-17 20:36:00 +02:00
# only checks line continuation
2020-06-30 21:18:36 +02:00
set errorformat = File \ %f \ line \ %l
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-06-30 21:18:36 +02:00
vim9script
cexpr 'File'
.. ' someFile' ..
' line 19'
assert_equal ( 19 , getqflist ( ) [0 ].lnum )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-06-30 21:18:36 +02:00
set errorformat &
enddef
2020-08-12 22:18:23 +02:00
def Test_statusline_syntax ( )
# legacy syntax is used for 'statusline'
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-08-12 22:18:23 +02:00
vim9script
func g :Status ( )
return '%{"x" is# "x"}'
endfunc
set laststatus = 2 statusline = %! Status ( )
redrawstatus
set laststatus statusline =
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-08-12 22:18:23 +02:00
enddef
2020-07-19 17:17:02 +02:00
def Test_list_vimscript ( )
# checks line continuation and comments
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-07-19 17:17:02 +02:00
vim9script
2020-09-27 15:19:27 +02:00
var mylist = [
2020-07-19 17:17:02 +02:00
'one' ,
# comment
'two' , # empty line follows
'three' ,
]
assert_equal ( ['one' , 'two' , 'three' ], mylist )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-08-20 15:02:42 +02:00
# check all lines from heredoc are kept
lines = < < trim END
# comment 1
two
# comment 3
five
# comment 6
END
assert_equal ( ['# comment 1' , 'two' , '# comment 3' , '' , 'five' , '# comment 6' ], lines )
2021-01-22 22:06:56 +01:00
lines = < < trim END
[{
a : 0 }]- > string ( ) - > assert_equal ( "[{'a': 0}]" )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-19 17:17:02 +02:00
enddef
2020-05-05 23:32:58 +02:00
if has ( 'channel' )
let someJob = test_null_job ( )
2020-05-05 22:08:26 +02:00
2020-05-05 23:32:58 +02:00
def FuncWithError ( )
echomsg g :someJob
enddef
2020-05-05 22:08:26 +02:00
2020-05-05 23:32:58 +02:00
func Test_convert_emsg_to_exception ( )
try
call FuncWithError ( )
catch
call assert_match ( 'Vim:E908:' , v :exception )
endtry
endfunc
endif
2020-05-05 22:08:26 +02:00
2021-02-17 21:57:03 +01:00
def Test_vim9script_mix ( )
var lines = < < trim END
if has ( g :feature )
" legacy script
let g :legacy = 1
finish
endif
vim9script
g :legacy = 0
END
g :feature = 'eval'
g :legacy = -1
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-02-17 21:57:03 +01:00
assert_equal ( 1 , g :legacy )
g :feature = 'noteval'
g :legacy = -1
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-02-17 21:57:03 +01:00
assert_equal ( 0 , g :legacy )
enddef
2020-02-23 18:08:33 +01:00
def Test_vim9script_fails ( )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( ['scriptversion 2' , 'vim9script' ], 'E1039:' )
v9 .CheckScriptFailure ( ['vim9script' , 'scriptversion 2' ], 'E1040:' )
2020-02-23 18:08:33 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( ['vim9script' , 'var str: string' , 'str = 1234' ], 'E1012:' )
v9 .CheckScriptFailure ( ['vim9script' , 'const str = "asdf"' , 'str = "xxx"' ], 'E46:' )
2020-06-19 18:34:15 +02:00
2020-09-04 21:18:46 +02:00
assert_fails ( 'vim9script' , 'E1038:' )
2022-02-06 17:30:41 +00:00
v9 .CheckDefFailure ( ['vim9script' ], 'E1038:' )
2022-02-06 20:28:13 +00:00
# no error when skipping
if has ( 'nothing' )
vim9script
endif
2021-03-17 15:03:04 +01:00
enddef
2021-03-04 12:38:21 +01:00
def Test_script_var_shadows_function ( )
var lines = < < trim END
vim9script
def Func ( ) : number
return 123
enddef
var Func = 1
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1041:' , 5 )
2021-03-04 12:38:21 +01:00
enddef
2021-12-11 13:54:46 +00:00
def Test_function_shadows_script_var ( )
var lines = < < trim END
vim9script
var Func = 1
def Func ( ) : number
return 123
enddef
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1041:' , 3 )
2021-12-11 13:54:46 +00:00
enddef
2021-07-10 19:42:03 +02:00
def Test_script_var_shadows_command ( )
var lines = < < trim END
var undo = 1
undo = 2
assert_equal ( 2 , undo )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-07-10 19:42:03 +02:00
lines = < < trim END
var undo = 1
undo
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1207:' , 2 )
2021-07-10 19:42:03 +02:00
enddef
2021-12-11 16:14:07 +00:00
def Test_vim9script_call_wrong_type ( )
var lines = < < trim END
vim9script
var Time = 'localtime'
Time ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1085:' )
2021-12-11 16:14:07 +00:00
enddef
2020-04-27 22:47:51 +02:00
def Test_vim9script_reload_delfunc ( )
2020-09-27 15:19:27 +02:00
var first_lines = < < trim END
2020-04-27 22:47:51 +02:00
vim9script
def FuncYes ( ) : string
return 'yes'
enddef
END
2020-09-27 15:19:27 +02:00
var withno_lines = < < trim END
2020-04-27 22:47:51 +02:00
def FuncNo ( ) : string
return 'no'
enddef
2020-04-27 23:39:30 +02:00
def g :DoCheck ( no_exists : bool )
assert_equal ( 'yes' , FuncYes ( ) )
assert_equal ( 'no' , FuncNo ( ) )
enddef
2020-04-27 22:47:51 +02:00
END
2020-09-27 15:19:27 +02:00
var nono_lines = < < trim END
2020-04-27 22:47:51 +02:00
def g :DoCheck ( no_exists : bool )
assert_equal ( 'yes' , FuncYes ( ) )
2020-09-06 22:26:57 +02:00
assert_fails ( 'FuncNo()' , 'E117:' , '' , 2 , 'DoCheck' )
2020-04-27 22:47:51 +02:00
enddef
END
# FuncNo ( ) is defined
2020-04-27 23:39:30 +02:00
writefile ( first_lines + withno_lines , 'Xreloaded.vim' )
2020-04-27 22:47:51 +02:00
source Xreloaded .vim
g :DoCheck ( true )
# FuncNo ( ) is not redefined
2020-04-27 23:39:30 +02:00
writefile ( first_lines + nono_lines , 'Xreloaded.vim' )
2020-04-27 22:47:51 +02:00
source Xreloaded .vim
2020-12-20 21:10:17 +01:00
g :DoCheck ( false )
2020-04-27 22:47:51 +02:00
# FuncNo ( ) is back
2020-04-27 23:39:30 +02:00
writefile ( first_lines + withno_lines , 'Xreloaded.vim' )
2020-04-27 22:47:51 +02:00
source Xreloaded .vim
2020-12-20 21:10:17 +01:00
g :DoCheck ( false )
2020-04-27 22:47:51 +02:00
delete ( 'Xreloaded.vim' )
enddef
2020-05-10 15:24:44 +02:00
def Test_vim9script_reload_delvar ( )
# write the script with a script - local variable
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-05-10 15:24:44 +02:00
vim9script
2020-09-27 15:19:27 +02:00
var name = 'string'
2020-05-10 15:24:44 +02:00
END
writefile ( lines , 'XreloadVar.vim' )
source XreloadVar .vim
# now write the script using the same variable locally - works
lines = < < trim END
vim9script
def Func ( )
2020-09-27 15:19:27 +02:00
var name = 'string'
2020-05-10 15:24:44 +02:00
enddef
END
writefile ( lines , 'XreloadVar.vim' )
source XreloadVar .vim
delete ( 'XreloadVar.vim' )
enddef
2020-08-14 17:08:15 +02:00
def Test_func_redefine_error ( )
2020-09-27 15:19:27 +02:00
var lines = [
2020-08-14 17:08:15 +02:00
'vim9script' ,
'def Func()' ,
' eval [][0]' ,
'enddef' ,
'Func()' ,
]
writefile ( lines , 'Xtestscript.vim' )
for count in range ( 3 )
try
source Xtestscript .vim
catch /E684/
# function name should contain < SNR > every time
assert_match ( 'E684: list index out of range' , v :exception )
assert_match ( 'function <SNR>\d\+_Func, line 1' , v :throwpoint )
endtry
endfor
delete ( 'Xtestscript.vim' )
enddef
2020-08-01 22:23:20 +02:00
def Test_func_redefine_fails ( )
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-08-01 22:23:20 +02:00
vim9script
def Func ( )
echo 'one'
enddef
def Func ( )
echo 'two'
enddef
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1073:' )
2020-08-07 22:00:26 +02:00
lines = < < trim END
vim9script
def Foo ( ) : string
return 'foo'
2021-12-11 13:54:46 +00:00
enddef
2020-08-07 22:00:26 +02:00
def Func ( )
2020-09-27 15:19:27 +02:00
var Foo = {- > 'lambda' }
2020-08-07 22:00:26 +02:00
enddef
defcompile
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1073:' )
2020-08-01 22:23:20 +02:00
enddef
2020-01-26 15:56:19 +01:00
def Test_fixed_size_list ( )
2020-07-17 20:36:00 +02:00
# will be allocated as one piece of memory , check that changes work
2020-09-27 15:19:27 +02:00
var l = [1 , 2 , 3 , 4 ]
2020-01-26 15:56:19 +01:00
l - > remove ( 0 )
l - > add ( 5 )
l - > insert ( 99 , 1 )
2020-02-02 17:22:27 +01:00
assert_equal ( [2 , 99 , 3 , 4 , 5 ], l )
2020-01-26 15:56:19 +01:00
enddef
2020-07-28 20:07:27 +02:00
def Test_no_insert_xit ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ['a = 1' ], 'E1100:' )
v9 .CheckDefExecFailure ( ['c = 1' ], 'E1100:' )
v9 .CheckDefExecFailure ( ['i = 1' ], 'E1100:' )
v9 .CheckDefExecFailure ( ['t = 1' ], 'E1100:' )
v9 .CheckDefExecFailure ( ['x = 1' ], 'E1100:' )
v9 .CheckScriptFailure ( ['vim9script' , 'a = 1' ], 'E488:' )
v9 .CheckScriptFailure ( ['vim9script' , 'a' ], 'E1100:' )
v9 .CheckScriptFailure ( ['vim9script' , 'c = 1' ], 'E488:' )
v9 .CheckScriptFailure ( ['vim9script' , 'c' ], 'E1100:' )
v9 .CheckScriptFailure ( ['vim9script' , 'i = 1' ], 'E488:' )
v9 .CheckScriptFailure ( ['vim9script' , 'i' ], 'E1100:' )
v9 .CheckScriptFailure ( ['vim9script' , 'o = 1' ], 'E1100:' )
v9 .CheckScriptFailure ( ['vim9script' , 'o' ], 'E1100:' )
v9 .CheckScriptFailure ( ['vim9script' , 't' ], 'E1100:' )
v9 .CheckScriptFailure ( ['vim9script' , 't = 1' ], 'E1100:' )
v9 .CheckScriptFailure ( ['vim9script' , 'x = 1' ], 'E1100:' )
enddef
def s :IfElse ( what : number ) : string
2020-09-27 15:19:27 +02:00
var res = ''
2020-02-06 20:39:45 +01:00
if what = = 1
res = "one"
elseif what = = 2
res = "two"
2020-01-31 20:10:50 +01:00
else
2020-02-06 20:39:45 +01:00
res = "three"
2020-01-31 20:10:50 +01:00
endif
2020-02-06 20:39:45 +01:00
return res
2020-01-31 20:10:50 +01:00
enddef
2020-02-06 20:39:45 +01:00
def Test_if_elseif_else ( )
assert_equal ( 'one' , IfElse ( 1 ) )
assert_equal ( 'two' , IfElse ( 2 ) )
assert_equal ( 'three' , IfElse ( 3 ) )
2020-02-02 17:22:27 +01:00
enddef
2020-04-02 21:13:25 +02:00
def Test_if_elseif_else_fails ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['elseif true' ], 'E582:' )
v9 .CheckDefFailure ( ['else' ], 'E581:' )
v9 .CheckDefFailure ( ['endif' ], 'E580:' )
v9 .CheckDefFailure ( ['if g:abool' , 'elseif xxx' ], 'E1001:' )
v9 .CheckDefFailure ( ['if true' , 'echo 1' ], 'E171:' )
2021-02-07 16:33:35 +01:00
var lines = < < trim END
var s = ''
if s = ''
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E488:' )
2021-02-07 16:33:35 +01:00
lines = < < trim END
var s = ''
if s = = ''
elseif s = ''
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E488:' )
2020-04-02 21:13:25 +02:00
enddef
2020-03-03 19:02:12 +01:00
let g :bool_true = v :true
let g :bool_false = v :false
def Test_if_const_expr ( )
2020-09-27 15:19:27 +02:00
var res = false
2020-03-03 19:02:12 +01:00
if true ? true : false
res = true
endif
assert_equal ( true , res )
2020-04-02 22:33:21 +02:00
g :glob = 2
if false
2020-06-20 22:50:47 +02:00
execute ( 'g:glob = 3' )
2020-04-02 22:33:21 +02:00
endif
assert_equal ( 2 , g :glob )
if true
2020-06-20 22:50:47 +02:00
execute ( 'g:glob = 3' )
2020-04-02 22:33:21 +02:00
endif
assert_equal ( 3 , g :glob )
2020-03-03 19:02:12 +01:00
res = false
if g :bool_true ? true : false
res = true
endif
assert_equal ( true , res )
res = false
if true ? g :bool_true : false
res = true
endif
assert_equal ( true , res )
res = false
if true ? true : g :bool_false
res = true
endif
assert_equal ( true , res )
res = false
if true ? false : true
res = true
endif
assert_equal ( false , res )
res = false
if false ? false : true
res = true
endif
assert_equal ( true , res )
res = false
if false ? true : false
res = true
endif
assert_equal ( false , res )
2020-04-02 21:13:25 +02:00
res = false
if has ( 'xyz' ) ? true : false
res = true
endif
assert_equal ( false , res )
2020-03-03 19:02:12 +01:00
res = false
if true && true
res = true
endif
assert_equal ( true , res )
res = false
if true && false
res = true
endif
assert_equal ( false , res )
res = false
if g :bool_true && false
res = true
endif
assert_equal ( false , res )
res = false
if true && g :bool_false
res = true
endif
assert_equal ( false , res )
res = false
if false && false
res = true
endif
assert_equal ( false , res )
res = false
if true | | false
res = true
endif
assert_equal ( true , res )
res = false
if g :bool_true | | false
res = true
endif
assert_equal ( true , res )
res = false
if true | | g :bool_false
res = true
endif
assert_equal ( true , res )
res = false
if false | | false
res = true
endif
assert_equal ( false , res )
2020-08-27 22:43:03 +02:00
# with constant "false" expression may be invalid so long as the syntax is OK
2021-07-10 19:42:03 +02:00
if false | eval 1 + 2 | endif
2020-08-27 22:43:03 +02:00
if false | eval burp + 234 | endif
if false | echo burp 234 'asd' | endif
if false
burp
endif
2021-08-07 18:12:40 +02:00
2022-02-04 21:58:58 +00:00
if 0
if 1
echo nothing
elseif 1
echo still nothing
endif
endif
2021-08-07 18:12:40 +02:00
# expression with line breaks skipped
if false
( 'aaa'
.. 'bbb'
.. 'ccc'
) - > setline ( 1 )
endif
2020-04-01 23:05:18 +02:00
enddef
2020-03-03 19:02:12 +01:00
2020-04-01 23:05:18 +02:00
def Test_if_const_expr_fails ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['if "aaa" == "bbb' ], 'E114:' )
v9 .CheckDefFailure ( ["if 'aaa' == 'bbb" ], 'E115:' )
v9 .CheckDefFailure ( ["if has('aaa'" ], 'E110:' )
v9 .CheckDefFailure ( ["if has('aaa') ? true false" ], 'E109:' )
2020-03-03 19:02:12 +01:00
enddef
2022-01-29 21:45:34 +00:00
def s :RunNested ( i : number ) : number
2020-09-27 15:19:27 +02:00
var x : number = 0
2020-06-18 18:26:24 +02:00
if i % 2
if 1
2020-07-17 20:36:00 +02:00
# comment
2020-06-18 18:26:24 +02:00
else
2020-07-17 20:36:00 +02:00
# comment
2020-06-18 18:26:24 +02:00
endif
x + = 1
else
x + = 1000
endif
return x
enddef
def Test_nested_if ( )
assert_equal ( 1 , RunNested ( 1 ) )
assert_equal ( 1000 , RunNested ( 2 ) )
enddef
2020-02-26 18:23:43 +01:00
def Test_execute_cmd ( )
2020-12-13 14:19:25 +01:00
# missing argument is ignored
execute
execute # comment
2020-02-26 18:23:43 +01:00
new
setline ( 1 , 'default' )
2020-09-06 15:58:36 +02:00
execute 'setline(1, "execute-string")'
2020-02-26 18:23:43 +01:00
assert_equal ( 'execute-string' , getline ( 1 ) )
2020-04-23 17:07:30 +02:00
2020-09-06 15:58:36 +02:00
execute "setline(1, 'execute-string')"
2020-04-23 17:07:30 +02:00
assert_equal ( 'execute-string' , getline ( 1 ) )
2020-09-27 15:19:27 +02:00
var cmd1 = 'setline(1,'
var cmd2 = '"execute-var")'
2020-04-23 17:07:30 +02:00
execute cmd1 cmd2 # comment
2020-02-26 18:23:43 +01:00
assert_equal ( 'execute-var' , getline ( 1 ) )
2020-04-23 17:07:30 +02:00
2020-09-06 15:58:36 +02:00
execute cmd1 cmd2 '|setline(1, "execute-var-string")'
2020-02-26 18:23:43 +01:00
assert_equal ( 'execute-var-string' , getline ( 1 ) )
2020-04-23 17:07:30 +02:00
2020-09-27 15:19:27 +02:00
var cmd_first = 'call '
var cmd_last = 'setline(1, "execute-var-var")'
2020-02-26 18:23:43 +01:00
execute cmd_first .. cmd_last
assert_equal ( 'execute-var-var' , getline ( 1 ) )
bwipe !
2020-04-02 22:33:21 +02:00
2020-09-27 15:19:27 +02:00
var n = true
2020-07-25 19:30:59 +02:00
execute 'echomsg' ( n ? '"true"' : '"no"' )
2022-01-29 21:45:34 +00:00
assert_match ( '^true$' , g :Screenline ( &lines ) )
2020-07-25 19:30:59 +02:00
2020-12-02 17:36:54 +01:00
echomsg [1 , 2 , 3 ] {a : 1 , b : 2 }
2022-01-29 21:45:34 +00:00
assert_match ( '^\[1, 2, 3\] {''a'': 1, ''b'': 2}$' , g :Screenline ( &lines ) )
2020-08-16 18:29:35 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['execute xxx' ], 'E1001:' , 1 )
v9 .CheckDefExecFailure ( ['execute "tabnext " .. 8' ], 'E475:' , 1 )
v9 .CheckDefFailure ( ['execute "cmd"# comment' ], 'E488:' , 1 )
2022-02-17 19:44:07 +00:00
if has ( 'channel' )
v9 .CheckDefExecFailure ( ['execute test_null_channel()' ], 'E908:' , 1 )
endif
2020-02-26 18:23:43 +01:00
enddef
2020-06-30 22:02:02 +02:00
def Test_execute_cmd_vimscript ( )
2020-07-17 20:36:00 +02:00
# only checks line continuation
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-06-30 22:02:02 +02:00
vim9script
execute 'g:someVar'
.. ' = ' ..
'28'
assert_equal ( 28 , g :someVar )
unlet g :someVar
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-06-30 22:02:02 +02:00
enddef
2020-02-26 18:23:43 +01:00
def Test_echo_cmd ( )
2020-04-23 17:07:30 +02:00
echo 'some' # comment
2020-04-02 22:33:21 +02:00
echon 'thing'
2022-01-29 21:45:34 +00:00
assert_match ( '^something$' , g :Screenline ( &lines ) )
2020-02-26 18:23:43 +01:00
2020-04-23 17:07:30 +02:00
echo "some" # comment
echon "thing"
2022-01-29 21:45:34 +00:00
assert_match ( '^something$' , g :Screenline ( &lines ) )
2020-04-23 17:07:30 +02:00
2020-09-27 15:19:27 +02:00
var str1 = 'some'
var str2 = 'more'
2020-02-26 18:23:43 +01:00
echo str1 str2
2022-01-29 21:45:34 +00:00
assert_match ( '^some more$' , g :Screenline ( &lines ) )
2020-04-23 17:07:30 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['echo "xxx"# comment' ], 'E488:' )
2020-02-26 18:23:43 +01:00
enddef
2020-04-23 22:16:53 +02:00
def Test_echomsg_cmd ( )
echomsg 'some' 'more' # comment
2022-01-29 21:45:34 +00:00
assert_match ( '^some more$' , g :Screenline ( &lines ) )
2020-04-23 22:16:53 +02:00
echo 'clear'
2020-06-22 23:02:51 +02:00
:1 messages
2022-01-29 21:45:34 +00:00
assert_match ( '^some more$' , g :Screenline ( &lines ) )
2020-04-23 22:16:53 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['echomsg "xxx"# comment' ], 'E488:' )
2020-04-23 22:16:53 +02:00
enddef
2020-06-30 22:02:02 +02:00
def Test_echomsg_cmd_vimscript ( )
2020-07-17 20:36:00 +02:00
# only checks line continuation
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-06-30 22:02:02 +02:00
vim9script
echomsg 'here'
.. ' is ' ..
'a message'
2022-01-29 21:45:34 +00:00
assert_match ( '^here is a message$' , g :Screenline ( &lines ) )
2020-06-30 22:02:02 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-06-30 22:02:02 +02:00
enddef
2020-04-23 22:16:53 +02:00
def Test_echoerr_cmd ( )
2021-08-07 15:05:47 +02:00
var local = 'local'
2020-05-05 22:08:26 +02:00
try
2021-08-07 15:05:47 +02:00
echoerr 'something' local 'wrong' # comment
2020-05-05 22:08:26 +02:00
catch
2021-08-07 15:05:47 +02:00
assert_match ( 'something local wrong' , v :exception )
2020-05-05 22:08:26 +02:00
endtry
2020-04-23 22:16:53 +02:00
enddef
2020-06-30 22:02:02 +02:00
def Test_echoerr_cmd_vimscript ( )
2020-07-17 20:36:00 +02:00
# only checks line continuation
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-06-30 22:02:02 +02:00
vim9script
try
echoerr 'this'
.. ' is ' ..
'wrong'
catch
assert_match ( 'this is wrong' , v :exception )
endtry
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-06-30 22:02:02 +02:00
enddef
2021-08-07 15:05:47 +02:00
def Test_echoconsole_cmd ( )
var local = 'local'
echoconsole 'something' local # comment
# output goes anywhere
enddef
2020-03-01 16:22:40 +01:00
def Test_for_outside_of_function ( )
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-03-01 16:22:40 +01:00
vim9script
new
for var in range ( 0 , 3 )
append ( line ( '$' ) , var )
endfor
assert_equal ( ['' , '0' , '1' , '2' , '3' ], getline ( 1 , '$' ) )
bwipe !
2021-03-26 18:49:22 +01:00
var result = ''
for i in [1 , 2 , 3 ]
var loop = ' loop ' .. i
result ..= loop
endfor
assert_equal ( ' loop 1 loop 2 loop 3' , result )
2020-03-01 16:22:40 +01:00
END
writefile ( lines , 'Xvim9for.vim' )
source Xvim9for .vim
delete ( 'Xvim9for.vim' )
enddef
2020-01-26 15:56:19 +01:00
2021-08-21 17:26:50 +02:00
def Test_for_skipped_block ( )
# test skipped blocks at outside of function
var lines = < < trim END
var result = []
if true
for n in [1 , 2 ]
result + = [n ]
endfor
else
for n in [3 , 4 ]
result + = [n ]
endfor
endif
assert_equal ( [1 , 2 ], result )
result = []
if false
for n in [1 , 2 ]
result + = [n ]
endfor
else
for n in [3 , 4 ]
result + = [n ]
endfor
endif
assert_equal ( [3 , 4 ], result )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-08-21 17:26:50 +02:00
# test skipped blocks at inside of function
lines = < < trim END
def DefTrue ( )
var result = []
if true
for n in [1 , 2 ]
result + = [n ]
endfor
else
for n in [3 , 4 ]
result + = [n ]
endfor
endif
assert_equal ( [1 , 2 ], result )
enddef
DefTrue ( )
def DefFalse ( )
var result = []
if false
for n in [1 , 2 ]
result + = [n ]
endfor
else
for n in [3 , 4 ]
result + = [n ]
endfor
endif
assert_equal ( [3 , 4 ], result )
enddef
DefFalse ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-08-21 17:26:50 +02:00
enddef
2020-04-02 21:13:25 +02:00
def Test_for_loop ( )
2021-04-13 20:53:13 +02:00
var lines = < < trim END
var result = ''
for cnt in range ( 7 )
if cnt = = 4
break
endif
if cnt = = 2
continue
endif
result ..= cnt .. '_'
endfor
assert_equal ( '0_1_3_' , result )
2020-07-05 21:38:11 +02:00
2021-04-13 20:53:13 +02:00
var concat = ''
for str in eval ( '["one", "two"]' )
concat ..= str
endfor
assert_equal ( 'onetwo' , concat )
2020-12-02 13:23:36 +01:00
2021-04-13 20:53:13 +02:00
var total = 0
for nr in
[1 , 2 , 3 ]
total + = nr
endfor
assert_equal ( 6 , total )
2020-12-02 13:23:36 +01:00
2021-04-13 20:53:13 +02:00
total = 0
for nr
in [1 , 2 , 3 ]
total + = nr
endfor
assert_equal ( 6 , total )
2020-12-02 13:23:36 +01:00
2021-04-13 20:53:13 +02:00
total = 0
for nr
in
[1 , 2 , 3 ]
total + = nr
endfor
assert_equal ( 6 , total )
2021-04-14 13:30:46 +02:00
# with type
total = 0
for n : number in [1 , 2 , 3 ]
total + = n
endfor
assert_equal ( 6 , total )
2021-04-15 21:48:32 +02:00
var chars = ''
for s : string in 'foobar'
chars ..= s
endfor
assert_equal ( 'foobar' , chars )
2021-07-07 21:55:25 +02:00
chars = ''
for x : string in {a : 'a' , b : 'b' }- > values ( )
chars ..= x
endfor
assert_equal ( 'ab' , chars )
2021-04-14 13:30:46 +02:00
# unpack with type
2021-04-13 20:53:13 +02:00
var res = ''
2021-04-14 13:30:46 +02:00
for [n : number , s : string ] in [[1 , 'a' ], [2 , 'b' ]]
res ..= n .. s
endfor
assert_equal ( '1a2b' , res )
2021-06-26 12:40:56 +02:00
# unpack with one var
var reslist = []
for [x ] in [['aaa' ], ['bbb' ]]
reslist - > add ( x )
endfor
assert_equal ( ['aaa' , 'bbb' ], reslist )
2021-04-14 13:30:46 +02:00
# loop over string
res = ''
2021-04-13 20:53:13 +02:00
for c in 'aéc̀d'
res ..= c .. '-'
endfor
assert_equal ( 'a-é-c̀-d-' , res )
res = ''
for c in ''
res ..= c .. '-'
endfor
assert_equal ( '' , res )
res = ''
for c in test_null_string ( )
res ..= c .. '-'
endfor
assert_equal ( '' , res )
2021-01-17 20:23:38 +01:00
2021-04-13 20:53:13 +02:00
var foo : list < dict < any > > = [
{a : 'Cat' }
]
for dd in foo
dd .counter = 12
endfor
assert_equal ( [{a : 'Cat' , counter : 12 }], foo )
2021-07-18 17:08:50 +02:00
reslist = []
for _ in range ( 3 )
reslist - > add ( 'x' )
endfor
assert_equal ( ['x' , 'x' , 'x' ], reslist )
2021-04-13 20:53:13 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-04-02 21:13:25 +02:00
enddef
2021-07-25 14:13:53 +02:00
def Test_for_loop_with_closure ( )
var lines = < < trim END
var flist : list < func >
for i in range ( 5 )
var inloop = i
flist [i ] = ( ) = > inloop
endfor
for i in range ( 5 )
assert_equal ( 4 , flist [i ]( ) )
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-07-25 14:13:53 +02:00
lines = < < trim END
var flist : list < func >
for i in range ( 5 )
var inloop = i
flist [i ] = ( ) = > {
return inloop
}
endfor
for i in range ( 5 )
assert_equal ( 4 , flist [i ]( ) )
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-07-25 14:13:53 +02:00
enddef
2020-04-02 21:13:25 +02:00
def Test_for_loop_fails ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ['for ' ], ['E1097:' , 'E690:' ])
v9 .CheckDefAndScriptFailure ( ['for x' ], ['E1097:' , 'E690:' ])
v9 .CheckDefAndScriptFailure ( ['for x in' ], ['E1097:' , 'E15:' ])
v9 .CheckDefAndScriptFailure ( ['for # in range(5)' ], 'E690:' )
v9 .CheckDefAndScriptFailure ( ['for i In range(5)' ], 'E690:' )
v9 .CheckDefAndScriptFailure ( ['var x = 5' , 'for x in range(5)' , 'endfor' ], ['E1017:' , 'E1041:' ])
v9 .CheckScriptFailure ( ['vim9script' , 'var x = 5' , 'for x in range(5)' , '# comment' , 'endfor' ], 'E1041:' , 3 )
v9 .CheckScriptFailure ( ['def Func(arg: any)' , 'for arg in range(5)' , 'enddef' , 'defcompile' ], 'E1006:' )
2020-12-05 13:41:01 +01:00
delfunc ! g :Func
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['for i in xxx' ], 'E1001:' )
v9 .CheckDefFailure ( ['endfor' ], 'E588:' )
v9 .CheckDefFailure ( ['for i in range(3)' , 'echo 3' ], 'E170:' )
2021-03-26 20:41:29 +01:00
# wrong type detected at compile time
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['for i in {a: 1}' , 'echo 3' , 'endfor' ], 'E1177: For loop on dict not supported' )
2021-03-26 20:41:29 +01:00
# wrong type detected at runtime
g :adict = {a : 1 }
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ['for i in g:adict' , 'echo 3' , 'endfor' ], 'E1177: For loop on dict not supported' )
2021-03-26 20:41:29 +01:00
unlet g :adict
2021-04-13 21:48:03 +02:00
var lines = < < trim END
var d : list < dict < any > > = [{a : 0 }]
for e in d
e = {a : 0 , b : '' }
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1018:' , 'E46:' ], 3 )
2021-04-15 21:48:32 +02:00
lines = < < trim END
for nr : number in ['foo' ]
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012: Type mismatch; expected number but got string' , 1 )
2021-07-05 21:41:48 +02:00
lines = < < trim END
for n : number in [1 , 2 ]
echo n
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1059:' , 1 )
2021-07-07 21:21:30 +02:00
lines = < < trim END
var d : dict < number > = {a : 1 , b : 2 }
for [k : job , v : job ] in d - > items ( )
echo k v
endfor
END
2022-02-02 16:20:26 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1013: Argument 1: type mismatch, expected job but got string' , 'E1012: Type mismatch; expected job but got string' ], 2 )
2021-11-22 20:10:18 +00:00
lines = < < trim END
var i = 0
for i in [1 , 2 , 3 ]
echo i
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1017:' , 'E1041:' ])
2021-11-22 20:10:18 +00:00
lines = < < trim END
var l = [0 ]
for l [0 ] in [1 , 2 , 3 ]
echo l [0 ]
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E461:' , 'E1017:' ])
2021-11-22 20:10:18 +00:00
lines = < < trim END
var d = {x : 0 }
for d .x in [1 , 2 , 3 ]
echo d .x
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E461:' , 'E1017:' ])
2022-02-02 16:20:26 +00:00
lines = < < trim END
var l : list < dict < any > > = [{a : 1 , b : 'x' }]
for item : dict < number > in l
echo item
endfor
END
v9 .CheckDefExecAndScriptFailure ( lines , 'E1012: Type mismatch; expected dict<number> but got dict<any>' )
lines = < < trim END
var l : list < dict < any > > = [{n : 1 }]
for item : dict < number > in l
item - > extend ( {s : '' })
endfor
END
v9 .CheckDefExecAndScriptFailure ( lines , 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>' )
2020-04-02 21:13:25 +02:00
enddef
2020-11-23 08:31:18 +01:00
2020-12-02 14:24:30 +01:00
def Test_for_loop_script_var ( )
# cannot use s :var in a :def function
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['for s:var in range(3)' , 'echo 3' ], 'E1254:' )
2020-12-02 14:24:30 +01:00
# can use s :var in Vim9 script , with or without s :
var lines = < < trim END
vim9script
var total = 0
for s :var in [1 , 2 , 3 ]
total + = s :var
endfor
assert_equal ( 6 , total )
total = 0
for var in [1 , 2 , 3 ]
total + = var
endfor
assert_equal ( 6 , total )
END
enddef
2020-11-23 08:31:18 +01:00
def Test_for_loop_unpack ( )
2020-12-01 16:30:44 +01:00
var lines = < < trim END
var result = []
for [v1 , v2 ] in [[1 , 2 ], [3 , 4 ]]
result - > add ( v1 )
result - > add ( v2 )
endfor
assert_equal ( [1 , 2 , 3 , 4 ], result )
2020-11-23 08:31:18 +01:00
2020-12-01 16:30:44 +01:00
result = []
for [v1 , v2 ; v3 ] in [[1 , 2 ], [3 , 4 , 5 , 6 ]]
result - > add ( v1 )
result - > add ( v2 )
result - > add ( v3 )
endfor
assert_equal ( [1 , 2 , [], 3 , 4 , [5 , 6 ]], result )
2020-11-23 08:31:18 +01:00
2020-12-01 16:30:44 +01:00
result = []
for [&ts , &sw ] in [[1 , 2 ], [3 , 4 ]]
result - > add ( &ts )
result - > add ( &sw )
endfor
assert_equal ( [1 , 2 , 3 , 4 ], result )
var slist : list < string >
for [$LOOPVAR , @r , v :errmsg ] in [['a' , 'b' , 'c' ], ['d' , 'e' , 'f' ]]
slist - > add ( $LOOPVAR )
slist - > add ( @r )
slist - > add ( v :errmsg )
endfor
assert_equal ( ['a' , 'b' , 'c' , 'd' , 'e' , 'f' ], slist )
slist = []
for [g :globalvar , b :bufvar , w :winvar , t :tabvar ] in [['global' , 'buf' , 'win' , 'tab' ], ['1' , '2' , '3' , '4' ]]
slist - > add ( g :globalvar )
slist - > add ( b :bufvar )
slist - > add ( w :winvar )
slist - > add ( t :tabvar )
endfor
assert_equal ( ['global' , 'buf' , 'win' , 'tab' , '1' , '2' , '3' , '4' ], slist )
2020-12-04 17:38:00 +01:00
unlet ! g :globalvar b :bufvar w :winvar t :tabvar
2021-05-22 21:40:39 +02:00
var res = []
for [_ , n , _ ] in [[1 , 2 , 3 ], [4 , 5 , 6 ]]
res - > add ( n )
endfor
assert_equal ( [2 , 5 ], res )
2020-12-01 16:30:44 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-12-01 16:30:44 +01:00
lines = < < trim END
2020-11-23 08:31:18 +01:00
for [v1 , v2 ] in [[1 , 2 , 3 ], [3 , 4 ]]
echo v1 v2
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E710:' , 1 )
2020-11-23 08:31:18 +01:00
lines = < < trim END
for [v1 , v2 ] in [[1 ], [3 , 4 ]]
echo v1 v2
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E711:' , 1 )
2020-11-23 08:31:18 +01:00
lines = < < trim END
for [v1 , v1 ] in [[1 , 2 ], [3 , 4 ]]
echo v1
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1017:' , 1 )
2020-11-23 08:31:18 +01:00
enddef
2020-04-02 21:13:25 +02:00
2021-02-13 15:02:46 +01:00
def Test_for_loop_with_try_continue ( )
2021-04-13 20:53:13 +02:00
var lines = < < trim END
var looped = 0
var cleanup = 0
for i in range ( 3 )
looped + = 1
try
eval [][0 ]
catch
continue
finally
cleanup + = 1
endtry
endfor
assert_equal ( 3 , looped )
assert_equal ( 3 , cleanup )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-02-13 15:02:46 +01:00
enddef
2021-08-20 20:54:25 +02:00
def Test_while_skipped_block ( )
# test skipped blocks at outside of function
var lines = < < trim END
var result = []
var n = 0
if true
n = 1
while n < 3
result + = [n ]
n + = 1
endwhile
else
n = 3
while n < 5
result + = [n ]
n + = 1
endwhile
endif
assert_equal ( [1 , 2 ], result )
result = []
if false
n = 1
while n < 3
result + = [n ]
n + = 1
endwhile
else
n = 3
while n < 5
result + = [n ]
n + = 1
endwhile
endif
assert_equal ( [3 , 4 ], result )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-08-20 20:54:25 +02:00
# test skipped blocks at inside of function
lines = < < trim END
def DefTrue ( )
var result = []
var n = 0
if true
n = 1
while n < 3
result + = [n ]
n + = 1
endwhile
else
n = 3
while n < 5
result + = [n ]
n + = 1
endwhile
endif
assert_equal ( [1 , 2 ], result )
enddef
DefTrue ( )
def DefFalse ( )
var result = []
var n = 0
if false
n = 1
while n < 3
result + = [n ]
n + = 1
endwhile
else
n = 3
while n < 5
result + = [n ]
n + = 1
endwhile
endif
assert_equal ( [3 , 4 ], result )
enddef
DefFalse ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-08-20 20:54:25 +02:00
enddef
2020-03-04 21:50:46 +01:00
def Test_while_loop ( )
2020-09-27 15:19:27 +02:00
var result = ''
var cnt = 0
2020-03-04 21:50:46 +01:00
while cnt < 555
if cnt = = 3
break
endif
cnt + = 1
if cnt = = 2
continue
endif
result ..= cnt .. '_'
endwhile
assert_equal ( '1_3_' , result )
2021-02-07 16:40:05 +01:00
var s = ''
2021-03-18 21:37:55 +01:00
while s = = 'x' # {comment }
2021-02-07 16:40:05 +01:00
endwhile
2020-03-04 21:50:46 +01:00
enddef
2021-11-22 18:31:02 +00:00
def Test_while_loop_in_script ( )
var lines = < < trim END
vim9script
var result = ''
var cnt = 0
while cnt < 3
var s = 'v' .. cnt
result ..= s
cnt + = 1
endwhile
assert_equal ( 'v0v1v2' , result )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-11-22 18:31:02 +00:00
enddef
2020-04-02 21:13:25 +02:00
def Test_while_loop_fails ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['while xxx' ], 'E1001:' )
v9 .CheckDefFailure ( ['endwhile' ], 'E588:' )
v9 .CheckDefFailure ( ['continue' ], 'E586:' )
v9 .CheckDefFailure ( ['if true' , 'continue' ], 'E586:' )
v9 .CheckDefFailure ( ['break' ], 'E587:' )
v9 .CheckDefFailure ( ['if true' , 'break' ], 'E587:' )
v9 .CheckDefFailure ( ['while 1' , 'echo 3' ], 'E170:' )
2021-02-07 16:33:35 +01:00
var lines = < < trim END
var s = ''
while s = ''
endwhile
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E488:' )
2020-03-31 23:13:10 +02:00
enddef
2020-03-20 20:48:49 +01:00
def Test_interrupt_loop ( )
2020-09-27 15:19:27 +02:00
var caught = false
var x = 0
2020-03-22 13:44:28 +01:00
try
while 1
x + = 1
if x = = 100
feedkeys ( "\<C-C>" , 'Lt' )
endif
endwhile
catch
caught = true
assert_equal ( 100 , x )
endtry
assert_true ( caught , 'should have caught an exception' )
2020-08-30 12:54:53 +02:00
# consume the CTRL - C
getchar ( 0 )
2020-03-20 20:48:49 +01:00
enddef
2020-03-20 18:39:46 +01:00
2020-04-12 16:38:57 +02:00
def Test_automatic_line_continuation ( )
2020-09-27 15:19:27 +02:00
var mylist = [
2020-04-12 16:38:57 +02:00
'one' ,
'two' ,
'three' ,
2020-07-17 20:36:00 +02:00
] # comment
2020-04-12 16:38:57 +02:00
assert_equal ( ['one' , 'two' , 'three' ], mylist )
2020-09-27 15:19:27 +02:00
var mydict = {
2020-12-02 17:36:54 +01:00
['one' ]: 1 ,
['two' ]: 2 ,
['three' ]:
2020-04-12 16:38:57 +02:00
3 ,
2020-07-17 20:36:00 +02:00
} # comment
2020-12-02 17:36:54 +01:00
assert_equal ( {one : 1 , two : 2 , three : 3 }, mydict )
mydict = {
2020-04-13 14:41:35 +02:00
one : 1 , # comment
two : # comment
2 , # comment
three : 3 # comment
}
2020-12-02 17:36:54 +01:00
assert_equal ( {one : 1 , two : 2 , three : 3 }, mydict )
mydict = {
2020-04-13 14:41:35 +02:00
one : 1 ,
two :
2 ,
three : 3
2020-04-12 16:38:57 +02:00
}
2020-12-02 17:36:54 +01:00
assert_equal ( {one : 1 , two : 2 , three : 3 }, mydict )
2020-04-12 20:19:16 +02:00
assert_equal (
['one' , 'two' , 'three' ],
split ( 'one two three' )
)
2020-04-12 16:38:57 +02:00
enddef
2020-04-16 22:10:49 +02:00
def Test_vim9_comment ( )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-16 22:10:49 +02:00
'vim9script' ,
'# something' ,
2020-12-12 21:25:56 +01:00
'#something' ,
'#{something' ,
2020-04-16 22:10:49 +02:00
])
2020-12-12 21:25:56 +01:00
split Xfile
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-12-12 21:25:56 +01:00
'vim9script' ,
'edit #something' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-12-12 21:25:56 +01:00
'vim9script' ,
'edit #{something' ,
])
close
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:10:49 +02:00
'vim9script' ,
':# something' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:10:49 +02:00
'# something' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:10:49 +02:00
':# something' ,
], 'E488:' )
2020-04-16 22:54:32 +02:00
{ # block start
} # block end
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-16 22:54:32 +02:00
'{# comment' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-16 22:54:32 +02:00
'{' ,
'}# comment' ,
], 'E488:' )
echo "yes" # comment
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-16 22:54:32 +02:00
'echo "yes"# comment' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-16 22:10:49 +02:00
'vim9script' ,
'echo "yes" # something' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:10:49 +02:00
'vim9script' ,
'echo "yes"# something' ,
], 'E121:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:10:49 +02:00
'vim9script' ,
'echo# something' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:10:49 +02:00
'echo "yes" # something' ,
], 'E121:' )
2020-04-16 22:54:32 +02:00
exe "echo" # comment
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-16 22:54:32 +02:00
'exe "echo"# comment' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-16 22:54:32 +02:00
'vim9script' ,
'exe "echo" # something' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:54:32 +02:00
'vim9script' ,
'exe "echo"# something' ,
], 'E121:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:54:32 +02:00
'vim9script' ,
'exe# something' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-16 22:54:32 +02:00
'exe "echo" # something' ,
], 'E121:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-16 22:10:49 +02:00
'try# comment' ,
2020-04-20 19:42:10 +02:00
' echo "yes"' ,
2020-04-16 22:10:49 +02:00
'catch' ,
'endtry' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 19:42:10 +02:00
'vim9script' ,
'try# comment' ,
'echo "yes"' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-23 17:07:30 +02:00
'try' ,
' throw#comment' ,
'catch' ,
'endtry' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-23 17:07:30 +02:00
'try' ,
' throw "yes"#comment' ,
'catch' ,
'endtry' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-16 22:10:49 +02:00
'try' ,
2020-04-20 19:42:10 +02:00
' echo "yes"' ,
2020-04-16 22:10:49 +02:00
'catch# comment' ,
'endtry' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 19:42:10 +02:00
'vim9script' ,
'try' ,
' echo "yes"' ,
'catch# comment' ,
'endtry' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-20 19:42:10 +02:00
'try' ,
' echo "yes"' ,
'catch /pat/# comment' ,
'endtry' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2020-04-16 22:10:49 +02:00
'try' ,
'echo "yes"' ,
'catch' ,
'endtry# comment' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 19:42:10 +02:00
'vim9script' ,
'try' ,
' echo "yes"' ,
'catch' ,
'endtry# comment' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2020-04-20 19:42:10 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 19:42:10 +02:00
'vim9script' ,
'hi # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 19:42:10 +02:00
'vim9script' ,
'hi# comment' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'hi Search # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'hi Search# comment' ,
], 'E416:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'hi link This Search # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'hi link This That# comment' ,
], 'E413:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'hi clear This # comment' ,
'hi clear # comment' ,
])
2020-07-17 20:36:00 +02:00
# not tested , because it doesn 't give an error but a warning :
# hi clear This # comment ',
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'hi clear# comment' ,
], 'E416:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'hi Group term=bold' ,
'match Group /todo/ # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'hi Group term=bold' ,
'match Group /todo/# comment' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'match # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'match# comment' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'match none # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'match none# comment' ,
], 'E475:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'menutrans clear # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'menutrans clear# comment text' ,
], 'E474:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax clear # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax clear# comment text' ,
], 'E28:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax keyword Word some' ,
'syntax clear Word # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax keyword Word some' ,
'syntax clear Word# comment text' ,
], 'E28:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax list # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax list# comment text' ,
], 'E28:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax match Word /pat/ oneline # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax match Word /pat/ oneline# comment' ,
], 'E475:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax keyword Word word # comm[ent' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax keyword Word word# comm[ent' ,
], 'E789:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax match Word /pat/ # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax match Word /pat/# comment' ,
], 'E402:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax match Word /pat/ contains=Something # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax match Word /pat/ contains=Something# comment' ,
], 'E475:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax match Word /pat/ contains= # comment' ,
], 'E406:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax match Word /pat/ contains=# comment' ,
], 'E475:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax region Word start=/pat/ end=/pat/ # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax region Word start=/pat/ end=/pat/# comment' ,
2020-07-18 18:13:02 +02:00
], 'E402:' )
2020-04-20 22:42:32 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax sync # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax sync# comment' ,
], 'E404:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax sync ccomment # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax sync ccomment# comment' ,
], 'E404:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax cluster Some contains=Word # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 22:42:32 +02:00
'vim9script' ,
'syntax cluster Some contains=Word# comment' ,
], 'E475:' )
2020-04-23 17:07:30 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
'command Echo echo # comment' ,
'command Echo # comment' ,
2020-12-05 13:41:01 +01:00
'delcommand Echo' ,
2020-04-23 17:07:30 +02:00
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
'command Echo echo# comment' ,
'Echo' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2020-12-05 13:41:01 +01:00
delcommand Echo
2020-12-10 21:01:30 +01:00
var curdir = getcwd ( )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-12-10 21:01:30 +01:00
'command Echo cd " comment' ,
'Echo' ,
'delcommand Echo' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-12-20 15:43:31 +01:00
'vim9script' ,
2020-12-10 21:01:30 +01:00
'command Echo cd # comment' ,
'Echo' ,
'delcommand Echo' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-12-10 21:01:30 +01:00
'vim9script' ,
'command Echo cd " comment' ,
'Echo' ,
], 'E344:' )
delcommand Echo
chdir ( curdir )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
'command Echo# comment' ,
], 'E182:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
'command Echo echo' ,
'command Echo# comment' ,
], 'E182:' )
2020-12-05 13:41:01 +01:00
delcommand Echo
2020-04-23 17:07:30 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
'function # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-07-29 14:40:25 +02:00
'vim9script' ,
'function " comment' ,
], 'E129:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
'function# comment' ,
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
2022-01-29 21:45:34 +00:00
'import "./vim9.vim" as v9' ,
'function v9.CheckScriptSuccess # comment' ,
2020-04-23 17:07:30 +02:00
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
2022-01-29 21:45:34 +00:00
'import "./vim9.vim" as v9' ,
'function v9.CheckScriptSuccess# comment' ,
], 'E1048: Item not found in script: CheckScriptSuccess#' )
2020-04-23 17:07:30 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
2020-04-27 22:47:51 +02:00
'func g:DeleteMeA()' ,
2020-04-23 17:07:30 +02:00
'endfunc' ,
2020-04-27 22:47:51 +02:00
'delfunction g:DeleteMeA # comment' ,
2020-04-23 17:07:30 +02:00
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
2020-04-27 22:47:51 +02:00
'func g:DeleteMeB()' ,
2020-04-23 17:07:30 +02:00
'endfunc' ,
2020-04-27 22:47:51 +02:00
'delfunction g:DeleteMeB# comment' ,
2020-04-23 17:07:30 +02:00
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
'call execute("ls") # comment' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-23 17:07:30 +02:00
'vim9script' ,
'call execute("ls")# comment' ,
], 'E488:' )
2020-07-22 18:17:08 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-07-22 18:17:08 +02:00
'def Test() " comment' ,
'enddef' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-07-22 18:17:08 +02:00
'vim9script' ,
'def Test() " comment' ,
'enddef' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-07-22 18:17:08 +02:00
'func Test() " comment' ,
'endfunc' ,
2020-12-05 13:41:01 +01:00
'delfunc Test' ,
2020-07-22 18:17:08 +02:00
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-07-22 18:17:08 +02:00
'vim9script' ,
'func Test() " comment' ,
'endfunc' ,
2020-07-29 14:40:25 +02:00
])
2020-07-22 18:17:08 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-07-22 18:17:08 +02:00
'def Test() # comment' ,
'enddef' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-07-22 18:17:08 +02:00
'func Test() # comment' ,
'endfunc' ,
], 'E488:' )
2021-06-02 15:28:15 +02:00
var lines = < < trim END
vim9script
syn region Text
\ start = 'foo'
#\ comment
\ end = 'bar'
2021-06-03 21:56:10 +02:00
syn region Text start = 'foo'
#\ comment
\ end = 'bar'
2021-06-02 15:28:15 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-06-02 15:28:15 +02:00
lines = < < trim END
vim9script
syn region Text
\ start = 'foo'
"\ comment
\ end = 'bar'
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E399:' )
2020-04-20 19:42:10 +02:00
enddef
def Test_vim9_comment_gui ( )
CheckCanRunGui
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 19:42:10 +02:00
'vim9script' ,
'gui#comment'
2020-12-25 17:36:27 +01:00
], 'E1144:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 19:42:10 +02:00
'vim9script' ,
'gui -f#comment'
2021-08-21 17:13:14 +02:00
], 'E194:' )
2020-04-16 22:10:49 +02:00
enddef
2020-04-18 19:53:28 +02:00
def Test_vim9_comment_not_compiled ( )
2020-06-20 22:50:47 +02:00
au TabEnter *.vim g :entered = 1
au TabEnter *.x g :entered = 2
2020-04-18 19:53:28 +02:00
edit test .vim
doautocmd TabEnter #comment
assert_equal ( 1 , g :entered )
doautocmd TabEnter f .x
assert_equal ( 2 , g :entered )
g :entered = 0
doautocmd TabEnter f .x #comment
assert_equal ( 2 , g :entered )
assert_fails ( 'doautocmd Syntax#comment' , 'E216:' )
au ! TabEnter
unlet g :entered
2020-04-19 16:28:59 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-19 16:28:59 +02:00
'vim9script' ,
2020-06-20 22:50:47 +02:00
'g:var = 123' ,
2020-06-21 15:52:59 +02:00
'b:var = 456' ,
'w:var = 777' ,
't:var = 888' ,
2020-04-19 16:28:59 +02:00
'unlet g:var w:var # something' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-19 16:28:59 +02:00
'vim9script' ,
2020-09-27 15:19:27 +02:00
'let var = 123' ,
], 'E1126: Cannot use :let in Vim9 script' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-09-27 15:19:27 +02:00
'vim9script' ,
'var g:var = 123' ,
2020-06-21 15:52:59 +02:00
], 'E1016: Cannot declare a global variable:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-06-21 15:52:59 +02:00
'vim9script' ,
2020-09-27 15:19:27 +02:00
'var b:var = 123' ,
2020-06-21 15:52:59 +02:00
], 'E1016: Cannot declare a buffer variable:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-06-21 15:52:59 +02:00
'vim9script' ,
2020-09-27 15:19:27 +02:00
'var w:var = 123' ,
2020-06-21 15:52:59 +02:00
], 'E1016: Cannot declare a window variable:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-06-21 15:52:59 +02:00
'vim9script' ,
2020-09-27 15:19:27 +02:00
'var t:var = 123' ,
2020-06-21 15:52:59 +02:00
], 'E1016: Cannot declare a tab variable:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-06-21 15:52:59 +02:00
'vim9script' ,
2020-09-27 15:19:27 +02:00
'var v:version = 123' ,
2020-06-21 15:52:59 +02:00
], 'E1016: Cannot declare a v: variable:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-06-21 15:52:59 +02:00
'vim9script' ,
2020-09-27 15:19:27 +02:00
'var $VARIABLE = "text"' ,
2020-06-21 15:52:59 +02:00
], 'E1016: Cannot declare an environment variable:' )
2020-06-20 22:50:47 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-06-20 22:50:47 +02:00
'vim9script' ,
'g:var = 123' ,
2020-05-14 22:41:15 +02:00
'unlet g:var# comment1' ,
2020-04-19 16:28:59 +02:00
], 'E108:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-19 16:28:59 +02:00
'let g:var = 123' ,
'unlet g:var # something' ,
], 'E488:' )
2020-04-20 17:46:14 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 17:46:14 +02:00
'vim9script' ,
2020-05-14 22:41:15 +02:00
'if 1 # comment2' ,
2020-04-20 17:46:14 +02:00
' echo "yes"' ,
'elseif 2 #comment' ,
' echo "no"' ,
'endif' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 17:46:14 +02:00
'vim9script' ,
2020-05-14 22:41:15 +02:00
'if 1# comment3' ,
2020-04-20 17:46:14 +02:00
' echo "yes"' ,
'endif' ,
2021-06-17 22:08:30 +02:00
], 'E488:' )
2020-04-20 17:46:14 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 17:46:14 +02:00
'vim9script' ,
2020-05-14 22:41:15 +02:00
'if 0 # comment4' ,
2020-04-20 17:46:14 +02:00
' echo "yes"' ,
'elseif 2#comment' ,
' echo "no"' ,
'endif' ,
2021-06-17 22:08:30 +02:00
], 'E488:' )
2020-04-20 17:46:14 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 17:46:14 +02:00
'vim9script' ,
2020-09-27 15:19:27 +02:00
'var v = 1 # comment5' ,
2020-04-20 17:46:14 +02:00
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-04-20 17:46:14 +02:00
'vim9script' ,
2020-09-27 15:19:27 +02:00
'var v = 1# comment6' ,
2021-06-17 22:08:30 +02:00
], 'E488:' )
2020-04-20 17:46:14 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2020-04-20 17:46:14 +02:00
'vim9script' ,
'new'
2020-09-06 15:58:36 +02:00
'setline(1, ["# define pat", "last"])' ,
2020-06-22 23:02:51 +02:00
':$' ,
2020-04-20 17:46:14 +02:00
'dsearch /pat/ #comment' ,
'bwipe!' ,
])
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-07-17 20:36:00 +02:00
'vim9script' ,
'new'
2020-09-06 15:58:36 +02:00
'setline(1, ["# define pat", "last"])' ,
2020-07-17 20:36:00 +02:00
':$' ,
'dsearch /pat/#comment' ,
'bwipe!' ,
], 'E488:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-07-17 20:36:00 +02:00
'vim9script' ,
'func! SomeFunc()' ,
], 'E477:' )
2020-04-18 19:53:28 +02:00
enddef
2020-05-10 21:20:29 +02:00
def Test_finish ( )
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-05-10 21:20:29 +02:00
vim9script
2020-06-20 22:50:47 +02:00
g :res = 'one'
2020-05-10 21:20:29 +02:00
if v :false | finish | endif
2020-06-20 22:50:47 +02:00
g :res = 'two'
2020-05-10 21:20:29 +02:00
finish
2020-06-20 22:50:47 +02:00
g :res = 'three'
2020-05-10 21:20:29 +02:00
END
writefile ( lines , 'Xfinished' )
source Xfinished
assert_equal ( 'two' , g :res )
unlet g :res
delete ( 'Xfinished' )
enddef
2020-05-14 23:20:55 +02:00
def Test_forward_declaration ( )
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-05-14 23:20:55 +02:00
vim9script
def GetValue ( ) : string
return theVal
enddef
2020-09-27 15:19:27 +02:00
var theVal = 'something'
2020-05-24 23:00:18 +02:00
g :initVal = GetValue ( )
2020-05-14 23:20:55 +02:00
theVal = 'else'
g :laterVal = GetValue ( )
END
writefile ( lines , 'Xforward' )
source Xforward
assert_equal ( 'something' , g :initVal )
assert_equal ( 'else' , g :laterVal )
unlet g :initVal
unlet g :laterVal
delete ( 'Xforward' )
enddef
2022-02-13 13:56:29 +00:00
def Test_declare_script_var_in_func ( )
2021-03-31 21:07:24 +02:00
var lines = < < trim END
vim9script
func Declare ( )
let s :local = 123
endfunc
Declare ( )
2022-02-13 13:56:29 +00:00
END
v9 .CheckScriptFailure ( lines , 'E1269:' )
enddef
def Test_lock_script_var ( )
var lines = < < trim END
vim9script
var local = 123
2021-03-31 21:07:24 +02:00
assert_equal ( 123 , local )
var error : string
try
local = 'asdf'
catch
error = v :exception
endtry
assert_match ( 'E1012: Type mismatch; expected number but got string' , error )
lockvar local
try
local = 999
catch
error = v :exception
endtry
assert_match ( 'E741: Value is locked: local' , error )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-03-31 21:07:24 +02:00
enddef
2020-08-14 20:52:28 +02:00
func Test_vim9script_not_global ( )
" check that items defined in Vim9 script are script-local, not global
let vim9lines = < < trim END
vim9script
2020-09-27 15:19:27 +02:00
var name = 'local'
2020-08-14 20:52:28 +02:00
func TheFunc ( )
echo 'local'
endfunc
def DefFunc ( )
echo 'local'
enddef
END
call writefile ( vim9lines , 'Xvim9script.vim' )
source Xvim9script .vim
try
echo g :var
assert_report ( 'did not fail' )
catch /E121:/
" caught
endtry
try
call TheFunc ( )
assert_report ( 'did not fail' )
catch /E117:/
" caught
endtry
try
call DefFunc ( )
assert_report ( 'did not fail' )
catch /E117:/
" caught
endtry
2020-08-30 12:54:53 +02:00
call delete ( 'Xvim9script.vim' )
2020-08-14 20:52:28 +02:00
endfunc
2020-07-04 17:39:10 +02:00
def Test_vim9_copen ( )
# this was giving an error for setting w :quickfix_title
copen
quit
enddef
2020-08-21 21:55:43 +02:00
def Test_script_var_in_autocmd ( )
# using a script variable from an autocommand , defined in a :def function in a
# legacy Vim script , cannot check the variable type .
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-08-21 21:55:43 +02:00
let s :counter = 1
def s :Func ( )
au ! CursorHold
au CursorHold * s :counter + = 1
enddef
call s :Func ( )
doau CursorHold
call assert_equal ( 2 , s :counter )
au ! CursorHold
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-08-21 21:55:43 +02:00
enddef
2021-07-15 18:09:53 +02:00
def Test_error_in_autoload_script ( )
var save_rtp = &rtp
var dir = getcwd ( ) .. '/Xruntime'
&rtp = dir
mkdir ( dir .. '/autoload' , 'p' )
var lines = < < trim END
vim9script noclear
2022-01-30 18:40:44 +00:00
export def Autoloaded ( )
2021-07-15 18:09:53 +02:00
enddef
def Broken ( )
var x : any = ''
eval x ! = 0
enddef
Broken ( )
END
writefile ( lines , dir .. '/autoload/script.vim' )
lines = < < trim END
vim9script
def CallAutoloaded ( )
2022-01-30 18:40:44 +00:00
script #Autoloaded ( )
2021-07-15 18:09:53 +02:00
enddef
function Legacy ( )
try
call s :CallAutoloaded ( )
catch
call assert_match ( 'E1030: Using a String as a Number' , v :exception )
endtry
endfunction
Legacy ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-07-15 18:09:53 +02:00
&rtp = save_rtp
delete ( dir , 'rf' )
enddef
2020-08-29 13:39:17 +02:00
def Test_invalid_sid ( )
assert_fails ( 'func <SNR>1234_func' , 'E123:' )
2020-08-30 12:54:53 +02:00
2022-01-29 21:45:34 +00:00
if g :RunVim ( [], ['wq! Xdidit' ], '+"func <SNR>1_func"' )
2020-09-06 15:58:36 +02:00
assert_equal ( [], readfile ( 'Xdidit' ) )
2020-08-29 13:39:17 +02:00
endif
delete ( 'Xdidit' )
enddef
2020-12-09 17:16:59 +01:00
def Test_restoring_cpo ( )
writefile ( ['vim9script' , 'set nocp' ], 'Xsourced' )
writefile ( ['call writefile(["done"], "Xdone")' , 'quit!' ], 'Xclose' )
2022-01-29 21:45:34 +00:00
if g :RunVim ( [], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose' )
2020-12-09 17:16:59 +01:00
assert_equal ( ['done' ], readfile ( 'Xdone' ) )
endif
delete ( 'Xsourced' )
delete ( 'Xclose' )
2020-12-20 15:43:31 +01:00
delete ( 'Xdone' )
2021-02-07 17:17:58 +01:00
2021-12-26 12:07:30 +00:00
writefile ( ['vim9script' , 'g:cpoval = &cpo' ], 'XanotherScript' )
2021-02-07 17:17:58 +01:00
set cpo = aABceFsMny >
edit XanotherScript
so %
assert_equal ( 'aABceFsMny>' , &cpo )
2021-12-26 12:07:30 +00:00
assert_equal ( 'aABceFs' , g :cpoval )
2021-02-07 17:17:58 +01:00
:1 del
2021-12-26 12:07:30 +00:00
setline ( 1 , 'let g:cpoval = &cpo' )
2021-02-07 17:17:58 +01:00
w
so %
assert_equal ( 'aABceFsMny>' , &cpo )
2021-12-26 12:07:30 +00:00
assert_equal ( 'aABceFsMny>' , g :cpoval )
2021-02-07 17:17:58 +01:00
delete ( 'XanotherScript' )
set cpo &vim
2021-12-26 12:07:30 +00:00
unlet g :cpoval
if has ( 'unix' )
# 'cpo' is not restored in main vimrc
var save_HOME = $HOME
$HOME = getcwd ( ) .. '/Xhome'
mkdir ( 'Xhome' )
var lines = < < trim END
vim9script
writefile ( ['before: ' .. &cpo ], 'Xresult' )
set cpo + = M
writefile ( ['after: ' .. &cpo ], 'Xresult' , 'a' )
END
writefile ( lines , 'Xhome/.vimrc' )
lines = < < trim END
call writefile ( ['later: ' .. &cpo ], 'Xresult' , 'a' )
END
writefile ( lines , 'Xlegacy' )
lines = < < trim END
vim9script
call writefile ( ['vim9: ' .. &cpo ], 'Xresult' , 'a' )
qa
END
writefile ( lines , 'Xvim9' )
2022-01-29 21:45:34 +00:00
var cmd = g :GetVimCommand ( ) .. " -S Xlegacy -S Xvim9"
2021-12-26 12:07:30 +00:00
cmd = substitute ( cmd , '-u NONE' , '' , '' )
exe "silent !" .. cmd
assert_equal ( [
'before: aABceFs' ,
'after: aABceFsM' ,
'later: aABceFsM' ,
'vim9: aABceFs' ], readfile ( 'Xresult' ) )
$HOME = save_HOME
delete ( 'Xhome' , 'rf' )
delete ( 'Xlegacy' )
delete ( 'Xvim9' )
delete ( 'Xresult' )
endif
2020-12-09 17:16:59 +01:00
enddef
2021-03-10 14:00:18 +01:00
" Use :function so we can use Check commands
func Test_no_redraw_when_restoring_cpo ( )
2021-03-10 13:40:08 +01:00
CheckScreendump
2021-03-10 14:00:18 +01:00
CheckFeature timers
2022-03-03 17:05:35 +00:00
call Run_test_no_redraw_when_restoring_cpo ( )
endfunc
2021-03-10 13:40:08 +01:00
2022-03-03 17:05:35 +00:00
def Run_test_no_redraw_when_restoring_cpo ( )
var lines = < < trim END
2021-03-10 13:40:08 +01:00
vim9script
2022-01-30 18:40:44 +00:00
export def Func ( )
2021-03-10 13:40:08 +01:00
enddef
END
2022-03-03 17:05:35 +00:00
mkdir ( 'Xdir/autoload' , 'p' )
writefile ( lines , 'Xdir/autoload/script.vim' )
2021-03-10 13:40:08 +01:00
2022-03-03 17:05:35 +00:00
lines = < < trim END
2021-03-10 13:40:08 +01:00
vim9script
set cpo + = M
exe 'set rtp^=' .. getcwd ( ) .. '/Xdir'
2022-01-30 18:40:44 +00:00
au CmdlineEnter : + + once timer_start ( 0 , ( _ ) = > script #Func ( ) )
2021-03-10 13:40:08 +01:00
setline ( 1 , 'some text' )
END
2022-03-03 17:05:35 +00:00
writefile ( lines , 'XTest_redraw_cpo' )
var buf = g :RunVimInTerminal ( '-S XTest_redraw_cpo' , {'rows' : 6 })
term_sendkeys ( buf , "V:" )
g :VerifyScreenDump ( buf , 'Test_vim9_no_redraw' , {})
# clean up
term_sendkeys ( buf , "\<Esc>u" )
g :StopVimInTerminal ( buf )
delete ( 'XTest_redraw_cpo' )
delete ( 'Xdir' , 'rf' )
enddef
2021-03-10 13:40:08 +01:00
2022-03-03 17:05:35 +00:00
func Test_reject_declaration ( )
CheckScreendump
call Run_test_reject_declaration ( )
2021-03-10 14:00:18 +01:00
endfunc
2021-03-10 13:40:08 +01:00
2022-03-03 17:05:35 +00:00
def Run_test_reject_declaration ( )
var buf = g :RunVimInTerminal ( '' , {'rows' : 6 })
term_sendkeys ( buf , ":vim9cmd var x: number\<CR>" )
2022-03-05 11:05:57 +00:00
g :VerifyScreenDump ( buf , 'Test_vim9_reject_declaration_1' , {})
term_sendkeys ( buf , ":\<CR>" )
term_sendkeys ( buf , ":vim9cmd g:foo = 123 | echo g:foo\<CR>" )
g :VerifyScreenDump ( buf , 'Test_vim9_reject_declaration_2' , {})
2022-03-03 17:05:35 +00:00
# clean up
g :StopVimInTerminal ( buf )
enddef
2020-12-09 17:16:59 +01:00
2020-09-13 18:57:47 +02:00
def Test_unset_any_variable ( )
2020-09-27 15:19:27 +02:00
var lines = < < trim END
var name : any
assert_equal ( 0 , name )
2020-09-13 18:57:47 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-09-13 18:57:47 +02:00
enddef
2020-09-25 23:12:51 +02:00
func Test_define_func_at_command_line ( )
2020-09-25 22:13:05 +02:00
CheckRunVimInTerminal
2020-09-25 23:12:51 +02:00
" call indirectly to avoid compilation error for missing functions
call Run_Test_define_func_at_command_line ( )
endfunc
def Run_Test_define_func_at_command_line ( )
2020-09-25 21:47:28 +02:00
# run in a separate Vim instance to avoid the script context
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-09-25 21:47:28 +02:00
func CheckAndQuit ( )
call assert_fails ( 'call Afunc()' , 'E117: Unknown function: Bfunc' )
call writefile ( ['errors: ' .. string ( v :errors ) ], 'Xdidcmd' )
endfunc
END
writefile ( ['' ], 'Xdidcmd' )
writefile ( lines , 'XcallFunc' )
2022-01-29 21:45:34 +00:00
var buf = g :RunVimInTerminal ( '-S XcallFunc' , {rows : 6 })
2020-09-25 21:47:28 +02:00
# define Afunc ( ) on the command line
term_sendkeys ( buf , ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>" )
term_sendkeys ( buf , ":call CheckAndQuit()\<CR>" )
2022-01-29 21:45:34 +00:00
g :WaitForAssert ( ( ) = > assert_equal ( ['errors: []' ], readfile ( 'Xdidcmd' ) ) )
2020-09-25 21:47:28 +02:00
2022-01-29 21:45:34 +00:00
call g :StopVimInTerminal ( buf )
2020-09-25 21:47:28 +02:00
delete ( 'XcallFunc' )
delete ( 'Xdidcmd' )
enddef
2020-10-10 19:07:09 +02:00
def Test_script_var_scope ( )
var lines = < < trim END
vim9script
if true
if true
var one = 'one'
echo one
endif
echo one
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E121:' , 7 )
2020-10-10 19:07:09 +02:00
lines = < < trim END
vim9script
if true
if false
var one = 'one'
echo one
else
var one = 'one'
echo one
endif
echo one
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E121:' , 10 )
2020-10-10 19:07:09 +02:00
lines = < < trim END
vim9script
while true
var one = 'one'
echo one
break
endwhile
echo one
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E121:' , 7 )
2020-10-10 19:07:09 +02:00
lines = < < trim END
vim9script
for i in range ( 1 )
var one = 'one'
echo one
endfor
echo one
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E121:' , 6 )
2020-10-10 21:33:48 +02:00
lines = < < trim END
vim9script
{
var one = 'one'
assert_equal ( 'one' , one )
}
assert_false ( exists ( 'one' ) )
assert_false ( exists ( 's:one' ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-10-10 21:33:48 +02:00
lines = < < trim END
vim9script
{
var one = 'one'
echo one
}
echo one
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E121:' , 6 )
2020-10-10 19:07:09 +02:00
enddef
2020-10-17 22:04:08 +02:00
def Test_catch_exception_in_callback ( )
var lines = < < trim END
vim9script
2021-04-09 20:24:31 +02:00
def Callback ( ...l : list < any > )
2020-10-17 22:04:08 +02:00
try
var x : string
var y : string
# this error should be caught with CHECKLEN
2021-12-01 17:38:01 +00:00
var sl = ['' ]
[x , y ] = sl
2020-10-17 22:04:08 +02:00
catch
g :caught = 'yes'
endtry
enddef
2020-12-02 17:36:54 +01:00
popup_menu ( 'popup' , {callback : Callback })
2020-10-17 22:04:08 +02:00
feedkeys ( "\r" , 'xt' )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-10-17 22:04:08 +02:00
unlet g :caught
enddef
2020-11-04 15:07:16 +01:00
def Test_no_unknown_error_after_error ( )
if ! has ( 'unix' ) | | ! has ( 'job' )
throw 'Skipped: not unix of missing +job feature'
endif
2021-09-26 20:14:39 +01:00
# FIXME : this check should not be needed
if has ( 'win32' )
throw 'Skipped: does not work on MS-Windows'
endif
2020-11-04 15:07:16 +01:00
var lines = < < trim END
vim9script
var source : list < number >
2021-04-09 20:24:31 +02:00
def Out_cb ( ...l : list < any > )
2020-11-04 15:07:16 +01:00
eval [][0 ]
enddef
2021-04-09 20:24:31 +02:00
def Exit_cb ( ...l : list < any > )
2020-11-04 15:07:16 +01:00
sleep 1 m
source + = l
enddef
2020-12-02 17:36:54 +01:00
var myjob = job_start ( 'echo burp' , {out_cb : Out_cb , exit_cb : Exit_cb , mode : 'raw' })
2020-12-21 18:11:24 +01:00
while job_status ( myjob ) = = 'run'
sleep 10 m
endwhile
2021-01-31 14:04:44 +01:00
# wait for Exit_cb ( ) to be called
2021-04-10 20:52:43 +02:00
sleep 200 m
2020-11-04 15:07:16 +01:00
END
writefile ( lines , 'Xdef' )
assert_fails ( 'so Xdef' , ['E684:' , 'E1012:' ])
delete ( 'Xdef' )
enddef
2020-12-01 20:12:24 +01:00
def InvokeNormal ( )
exe "norm! :m+1\r"
enddef
def Test_invoke_normal_in_visual_mode ( )
xnoremap < F3 > < Cmd > call < SID > InvokeNormal ( ) < CR >
new
setline ( 1 , ['aaa' , 'bbb' ])
feedkeys ( "V\<F3>" , 'xt' )
assert_equal ( ['bbb' , 'aaa' ], getline ( 1 , 2 ) )
xunmap < F3 >
enddef
2020-12-13 17:50:20 +01:00
def Test_white_space_after_command ( )
var lines = < < trim END
exit_cb : Func })
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1144:' , 1 )
2020-12-25 17:36:27 +01:00
lines = < < trim END
e #
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1144:' , 1 )
2020-12-13 17:50:20 +01:00
enddef
2020-12-24 21:56:41 +01:00
def Test_script_var_gone_when_sourced_twice ( )
var lines = < < trim END
vim9script
if exists ( 'g:guard' )
finish
endif
g :guard = 1
var name = 'thename'
def g :GetName ( ) : string
return name
enddef
def g :SetName ( arg : string )
name = arg
enddef
END
writefile ( lines , 'XscriptTwice.vim' )
so XscriptTwice .vim
assert_equal ( 'thename' , g :GetName ( ) )
g :SetName ( 'newname' )
assert_equal ( 'newname' , g :GetName ( ) )
so XscriptTwice .vim
assert_fails ( 'call g:GetName()' , 'E1149:' )
assert_fails ( 'call g:SetName("x")' , 'E1149:' )
delfunc g :GetName
delfunc g :SetName
delete ( 'XscriptTwice.vim' )
unlet g :guard
enddef
2021-02-19 21:42:57 +01:00
def Test_unsupported_commands ( )
var lines = < < trim END
ka
END
2022-03-04 17:10:19 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E476:' , 'E492:' ])
2021-02-19 21:42:57 +01:00
2021-02-20 08:16:51 +01:00
lines = < < trim END
:1 ka
END
2022-03-04 17:10:19 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E476:' , 'E492:' ])
2021-02-20 08:16:51 +01:00
2021-02-19 21:42:57 +01:00
lines = < < trim END
t
END
2022-03-04 17:10:19 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1100:' )
2021-02-19 21:42:57 +01:00
lines = < < trim END
x
END
2022-03-04 17:10:19 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1100:' )
2021-02-19 21:42:57 +01:00
lines = < < trim END
xit
END
2022-03-04 17:10:19 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1100:' )
lines = < < trim END
Print
END
v9 .CheckDefAndScriptFailure ( lines , ['E476: Invalid command: Print' , 'E492: Not an editor command: Print' ])
lines = < < trim END
mode 4
END
v9 .CheckDefAndScriptFailure ( lines , ['E476: Invalid command: mode 4' , 'E492: Not an editor command: mode 4' ])
2021-02-19 21:42:57 +01:00
enddef
2021-04-17 17:59:19 +02:00
def Test_mapping_line_number ( )
var lines = < < trim END
vim9script
def g :FuncA ( )
# Some comment
FuncB ( 0 )
enddef
# Some comment
def FuncB (
# Some comment
n : number
)
exe 'nno '
# Some comment
.. '<F3> a'
.. 'b'
.. 'c'
enddef
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-04-17 17:59:19 +02:00
var res = execute ( 'verbose nmap <F3>' )
assert_match ( 'No mapping found' , res )
g :FuncA ( )
res = execute ( 'verbose nmap <F3>' )
assert_match ( ' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11' , res )
nunmap < F3 >
delfunc g :FuncA
enddef
2021-07-08 17:35:36 +02:00
def Test_option_set ( )
# legacy script allows for white space
var lines = < < trim END
set foldlevel = 11
call assert_equal ( 11 , &foldlevel )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-07-08 17:35:36 +02:00
set foldlevel
set foldlevel = 12
assert_equal ( 12 , &foldlevel )
set foldlevel + = 2
assert_equal ( 14 , &foldlevel )
set foldlevel - = 3
assert_equal ( 11 , &foldlevel )
lines = < < trim END
set foldlevel = 1
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1205: No white space allowed between option and: =1' )
2021-07-08 17:35:36 +02:00
lines = < < trim END
set foldlevel + = 1
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1205: No white space allowed between option and: +=1' )
2021-07-08 17:35:36 +02:00
lines = < < trim END
set foldlevel ^= 1
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1205: No white space allowed between option and: ^=1' )
2021-07-08 17:35:36 +02:00
lines = < < trim END
set foldlevel - = 1
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1205: No white space allowed between option and: -=1' )
2021-07-08 17:35:36 +02:00
set foldlevel &
enddef
2021-06-20 12:40:08 +02:00
def Test_option_modifier ( )
2021-07-08 16:40:13 +02:00
# legacy script allows for white space
2021-06-20 12:40:08 +02:00
var lines = < < trim END
set hlsearch & hlsearch !
call assert_equal ( 1 , &hlsearch )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-06-20 12:40:08 +02:00
2021-07-08 16:40:13 +02:00
set hlsearch
set hlsearch !
assert_equal ( false , &hlsearch )
set hlsearch
set hlsearch &
assert_equal ( false , &hlsearch )
2021-06-20 12:40:08 +02:00
lines = < < trim END
set hlsearch &
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1205: No white space allowed between option and: &' )
2021-06-20 12:40:08 +02:00
lines = < < trim END
2021-07-08 16:40:13 +02:00
set hlsearch !
2021-06-20 12:40:08 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1205: No white space allowed between option and: !' )
2021-07-08 16:40:13 +02:00
set hlsearch &
2021-06-20 12:40:08 +02:00
enddef
2021-07-11 16:52:45 +02:00
" This must be called last, it may cause following :def functions to fail
def Test_xxx_echoerr_line_number ( )
var lines = < < trim END
echoerr 'some'
.. ' error'
.. ' continued'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'some error continued' , 1 )
2021-07-11 16:52:45 +02:00
enddef
2021-12-10 21:05:53 +00:00
func Test_debug_with_lambda ( )
2021-12-10 16:55:58 +00:00
CheckRunVimInTerminal
2021-12-10 21:05:53 +00:00
" call indirectly to avoid compilation error for missing functions
call Run_Test_debug_with_lambda ( )
endfunc
def Run_Test_debug_with_lambda ( )
2021-12-10 16:55:58 +00:00
var lines = < < trim END
vim9script
def Func ( )
var n = 0
echo [0 ]- > filter ( ( _ , v ) = > v = = n )
enddef
breakadd func Func
Func ( )
END
writefile ( lines , 'XdebugFunc' )
2022-01-29 21:45:34 +00:00
var buf = g :RunVimInTerminal ( '-S XdebugFunc' , {rows : 6 , wait_for_ruler : 0 })
g :WaitForAssert ( ( ) = > assert_match ( '^>' , term_getline ( buf , 6 ) ) )
2021-12-10 16:55:58 +00:00
term_sendkeys ( buf , "cont\<CR>" )
2022-01-29 21:45:34 +00:00
g :WaitForAssert ( ( ) = > assert_match ( '\[0\]' , term_getline ( buf , 5 ) ) )
2021-12-10 16:55:58 +00:00
2022-01-29 21:45:34 +00:00
g :StopVimInTerminal ( buf )
2021-12-10 16:55:58 +00:00
delete ( 'XdebugFunc' )
enddef
2021-12-23 21:14:37 +00:00
func Test_debug_running_out_of_lines ( )
CheckRunVimInTerminal
" call indirectly to avoid compilation error for missing functions
call Run_Test_debug_running_out_of_lines ( )
endfunc
def Run_Test_debug_running_out_of_lines ( )
var lines = < < trim END
vim9script
def Crash ( )
#
#
#
#
#
#
#
if true
#
endif
enddef
breakadd func Crash
Crash ( )
END
writefile ( lines , 'XdebugFunc' )
2022-01-29 21:45:34 +00:00
var buf = g :RunVimInTerminal ( '-S XdebugFunc' , {rows : 6 , wait_for_ruler : 0 })
g :WaitForAssert ( ( ) = > assert_match ( '^>' , term_getline ( buf , 6 ) ) )
2021-12-23 21:14:37 +00:00
term_sendkeys ( buf , "next\<CR>" )
2022-01-29 21:45:34 +00:00
g :TermWait ( buf )
g :WaitForAssert ( ( ) = > assert_match ( '^>' , term_getline ( buf , 6 ) ) )
2021-12-23 21:14:37 +00:00
term_sendkeys ( buf , "cont\<CR>" )
2022-01-29 21:45:34 +00:00
g :TermWait ( buf )
2021-12-23 21:14:37 +00:00
2022-01-29 21:45:34 +00:00
g :StopVimInTerminal ( buf )
2021-12-23 21:14:37 +00:00
delete ( 'XdebugFunc' )
enddef
2022-01-29 21:45:34 +00:00
def s :ProfiledWithLambda ( )
2021-07-11 15:26:13 +02:00
var n = 3
echo [[1 , 2 ], [3 , 4 ]]- > filter ( ( _ , l ) = > l [0 ] = = n )
enddef
2022-01-29 21:45:34 +00:00
def s :ProfiledNested ( )
2021-07-11 17:55:01 +02:00
var x = 0
def Nested ( ) : any
return x
enddef
Nested ( )
enddef
2021-07-11 20:22:30 +02:00
def ProfiledNestedProfiled ( )
var x = 0
def Nested ( ) : any
return x
enddef
Nested ( )
enddef
2022-01-19 20:48:37 +00:00
def Test_ambigous_command_error ( )
var lines = < < trim END
vim9script
command CmdA echomsg 'CmdA'
command CmdB echomsg 'CmdB'
Cmd
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E464: Ambiguous use of user-defined command: Cmd' , 4 )
2022-01-19 20:48:37 +00:00
lines = < < trim END
vim9script
def Func ( )
Cmd
enddef
Func ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E464: Ambiguous use of user-defined command: Cmd' , 1 )
2022-01-19 20:48:37 +00:00
lines = < < trim END
vim9script
nnoremap < F3 > < ScriptCmd > Cmd < CR >
feedkeys ( "\<F3>" , 'xt' )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E464: Ambiguous use of user-defined command: Cmd' , 3 )
2022-01-19 20:48:37 +00:00
delcommand CmdA
delcommand CmdB
nunmap < F3 >
enddef
2021-11-21 11:36:04 +00:00
" Execute this near the end, profiling doesn't stop until Vim exits.
2021-07-11 15:26:13 +02:00
" This only tests that it works, not the profiling output.
def Test_xx_profile_with_lambda ( )
2021-07-11 16:31:51 +02:00
CheckFeature profile
2021-07-11 15:26:13 +02:00
profile start Xprofile .log
2021-07-11 17:55:01 +02:00
profile func ProfiledWithLambda
ProfiledWithLambda ( )
2021-07-11 20:22:30 +02:00
2021-07-11 17:55:01 +02:00
profile func ProfiledNested
ProfiledNested ( )
2021-07-11 20:22:30 +02:00
# Also profile the nested function . Use a different function , although the
# contents is the same , to make sure it was not already compiled .
profile func *
2022-01-29 21:45:34 +00:00
g :ProfiledNestedProfiled ( )
2021-07-11 20:22:30 +02:00
profdel func *
profile pause
2021-07-11 15:26:13 +02:00
enddef
2020-04-02 22:33:21 +02:00
" Keep this last, it messes up highlighting.
def Test_substitute_cmd ( )
new
setline ( 1 , 'something' )
:substitute ( some ( other (
assert_equal ( 'otherthing' , getline ( 1 ) )
bwipe !
2020-07-17 20:36:00 +02:00
# also when the context is Vim9 script
2020-09-27 15:19:27 +02:00
var lines = < < trim END
2020-04-02 22:33:21 +02:00
vim9script
new
setline ( 1 , 'something' )
:substitute ( some ( other (
assert_equal ( 'otherthing' , getline ( 1 ) )
bwipe !
END
writefile ( lines , 'Xvim9lines' )
source Xvim9lines
delete ( 'Xvim9lines' )
enddef
2020-01-26 15:56:19 +01:00
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker