2020-09-21 22:21:42 +02:00
" Test Vim9 assignments
source check .vim
2022-01-29 21:45:34 +00:00
import './vim9.vim' as v9
2022-01-05 10:16:30 +00:00
source term_util .vim
2020-09-21 22:21:42 +02:00
let s :appendToMe = 'xxx'
let s :addToMe = 111
2022-02-12 19:52:25 +00:00
let s :newVar = ''
2020-09-21 22:21:42 +02:00
let g :existing = 'yes'
let g :inc_counter = 1
let $SOME_ENV_VAR = 'some'
let g :alist = [7 ]
2021-02-20 17:04:02 +01:00
let g :adict = #{a : 1 }
2020-09-21 22:21:42 +02:00
let g :astring = 'text'
def Test_assignment_bool ( )
2020-09-26 15:09:30 +02:00
var bool1 : bool = true
2020-09-21 22:21:42 +02:00
assert_equal ( v :true , bool1 )
2020-09-26 15:09:30 +02:00
var bool2 : bool = false
2020-09-21 22:21:42 +02:00
assert_equal ( v :false , bool2 )
2020-09-26 15:09:30 +02:00
var bool3 : bool = 0
2020-09-21 22:21:42 +02:00
assert_equal ( false , bool3 )
2020-09-26 15:09:30 +02:00
var bool4 : bool = 1
2020-09-21 22:21:42 +02:00
assert_equal ( true , bool4 )
2020-10-03 22:52:39 +02:00
var bool5 : bool = 1 && true
2020-09-21 22:21:42 +02:00
assert_equal ( true , bool5 )
2020-10-03 22:52:39 +02:00
var bool6 : bool = 0 && 1
2020-09-21 22:21:42 +02:00
assert_equal ( false , bool6 )
2020-10-03 22:52:39 +02:00
var bool7 : bool = 0 | | 1 && true
2020-09-21 22:21:42 +02:00
assert_equal ( true , bool7 )
2020-09-26 15:09:30 +02:00
var lines = < < trim END
2020-09-21 22:21:42 +02:00
vim9script
def GetFlag ( ) : bool
2020-09-26 15:09:30 +02:00
var flag : bool = 1
2020-09-21 22:21:42 +02:00
return flag
enddef
2020-09-26 15:09:30 +02:00
var flag : bool = GetFlag ( )
2020-09-21 22:21:42 +02:00
assert_equal ( true , flag )
flag = 0
assert_equal ( false , flag )
flag = 1
assert_equal ( true , flag )
2020-10-03 22:52:39 +02:00
flag = 1 | | true
2020-09-21 22:21:42 +02:00
assert_equal ( true , flag )
2020-10-03 22:52:39 +02:00
flag = 1 && false
2020-09-21 22:21:42 +02:00
assert_equal ( false , flag )
2020-12-31 17:41:01 +01:00
var cp : bool = &cp
var fen : bool = &l :fen
2020-09-21 22:21:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
v9 .CheckDefAndScriptFailure ( ['var x: bool = 2' ], 'E1012:' )
v9 .CheckDefAndScriptFailure ( ['var x: bool = -1' ], 'E1012:' )
v9 .CheckDefAndScriptFailure ( ['var x: bool = [1]' ], 'E1012:' )
v9 .CheckDefAndScriptFailure ( ['var x: bool = {}' ], 'E1012:' )
v9 .CheckDefAndScriptFailure ( ['var x: bool = "x"' ], 'E1012:' )
2021-01-23 13:39:14 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ['var x: bool = "x"' , '' , 'eval 0' ], 'E1012:' , 1 )
2020-09-21 22:21:42 +02:00
enddef
def Test_syntax ( )
2020-09-27 21:58:45 +02:00
var name = 234
2020-09-26 15:09:30 +02:00
var other : list < string > = ['asdf' ]
2020-09-21 22:21:42 +02:00
enddef
def Test_assignment ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var x:string' ], 'E1069:' )
v9 .CheckDefFailure ( ['var x:string = "x"' ], 'E1069:' )
v9 .CheckDefFailure ( ['var a:string = "x"' ], 'E1069:' )
v9 .CheckDefFailure ( ['var lambda = () => "lambda"' ], 'E704:' )
v9 .CheckScriptFailure ( ['var x = "x"' ], 'E1124:' )
2020-09-21 22:21:42 +02:00
2021-03-17 20:56:38 +01:00
# lower case name is OK for a list
var lambdaLines = < < trim END
2022-01-30 15:28:30 +00:00
var lambdaList : list < func > = [g :Test_syntax ]
2021-03-17 20:56:38 +01:00
lambdaList [0 ] = ( ) = > "lambda"
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lambdaLines )
2021-03-17 20:56:38 +01:00
2020-09-26 15:09:30 +02:00
var nr : number = 1234
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var nr: number = "asdf"' ], 'E1012:' )
2020-09-21 22:21:42 +02:00
2020-09-26 15:09:30 +02:00
var a : number = 6 #comment
2020-09-21 22:21:42 +02:00
assert_equal ( 6 , a )
if has ( 'channel' )
2020-09-26 15:09:30 +02:00
var chan1 : channel
2020-10-17 18:51:52 +02:00
assert_equal ( 'fail' , ch_status ( chan1 ) )
2020-09-26 15:09:30 +02:00
var job1 : job
2020-10-17 18:51:52 +02:00
assert_equal ( 'fail' , job_status ( job1 ) )
2020-10-12 20:31:26 +02:00
# calling job_start ( ) is in test_vim9_fails .vim , it causes leak reports
2020-09-21 22:21:42 +02:00
endif
if has ( 'float' )
2020-09-26 15:09:30 +02:00
var float1 : float = 3 .4
2020-09-21 22:21:42 +02:00
endif
2020-09-26 15:09:30 +02:00
var Funky1 : func
var Funky2 : func = function ( 'len' )
var Party2 : func = funcref ( 'g:Test_syntax' )
2020-09-21 22:21:42 +02:00
g :newvar = 'new' #comment
assert_equal ( 'new' , g :newvar )
assert_equal ( 'yes' , g :existing )
g :existing = 'no'
assert_equal ( 'no' , g :existing )
v :char = 'abc'
assert_equal ( 'abc' , v :char )
$ENVVAR = 'foobar'
assert_equal ( 'foobar' , $ENVVAR )
$ENVVAR = ''
2020-09-26 15:09:30 +02:00
var lines = < < trim END
2020-09-21 22:21:42 +02:00
vim9script
$ENVVAR = 'barfoo'
assert_equal ( 'barfoo' , $ENVVAR )
$ENVVAR = ''
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-21 22:21:42 +02:00
2022-02-12 19:52:25 +00:00
appendToMe ..= 'yyy'
assert_equal ( 'xxxyyy' , appendToMe )
addToMe + = 222
assert_equal ( 333 , addToMe )
newVar = 'new'
assert_equal ( 'new' , newVar )
2020-09-21 22:21:42 +02:00
set ts = 7
2020-12-31 17:41:01 +01:00
var ts : number = &ts
assert_equal ( 7 , ts )
2020-09-21 22:21:42 +02:00
&ts + = 1
assert_equal ( 8 , &ts )
&ts - = 3
assert_equal ( 5 , &ts )
&ts *= 2
assert_equal ( 10 , &ts )
&ts /= 3
assert_equal ( 3 , &ts )
set ts = 10
&ts %= 4
assert_equal ( 2 , &ts )
if has ( 'float' )
2020-09-26 15:09:30 +02:00
var f100 : float = 100 .0
2020-09-21 22:21:42 +02:00
f100 /= 5
assert_equal ( 20 .0 , f100 )
2020-09-26 15:09:30 +02:00
var f200 : float = 200 .0
2020-09-21 22:21:42 +02:00
f200 /= 5 .0
assert_equal ( 40 .0 , f200 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var nr: number = 200' , 'nr /= 5.0' ], 'E1012:' )
2020-09-21 22:21:42 +02:00
endif
lines = < < trim END
&ts = 6
&ts + = 3
assert_equal ( 9 , &ts )
&l :ts = 6
assert_equal ( 6 , &ts )
&l :ts + = 2
assert_equal ( 8 , &ts )
&g :ts = 6
assert_equal ( 6 , &g :ts )
&g :ts + = 2
assert_equal ( 8 , &g :ts )
2021-01-04 13:37:54 +01:00
&number = true
assert_equal ( true , &number )
&number = 0
assert_equal ( false , &number )
&number = 1
assert_equal ( true , &number )
&number = false
assert_equal ( false , &number )
2020-09-21 22:21:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['¬ex += 3' ], 'E113:' )
v9 .CheckDefFailure ( ['&ts ..= "xxx"' ], 'E1019:' )
v9 .CheckDefFailure ( ['&ts = [7]' ], 'E1012:' )
v9 .CheckDefExecFailure ( ['&ts = g:alist' ], 'E1012: Type mismatch; expected number but got list<number>' )
v9 .CheckDefFailure ( ['&ts = "xx"' ], 'E1012:' )
v9 .CheckDefExecFailure ( ['&ts = g:astring' ], 'E1012: Type mismatch; expected number but got string' )
v9 .CheckDefFailure ( ['&path += 3' ], 'E1012:' )
v9 .CheckDefExecFailure ( ['&bs = "asdf"' ], 'E474:' )
2020-09-21 22:21:42 +02:00
# test freeing ISN_STOREOPT
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['&ts = 3' , 'var asdf' ], 'E1022:' )
2020-09-21 22:21:42 +02:00
&ts = 8
lines = < < trim END
2020-09-26 15:09:30 +02:00
var save_TI = &t_TI
2020-09-21 22:21:42 +02:00
&t_TI = ''
assert_equal ( '' , &t_TI )
&t_TI = 'xxx'
assert_equal ( 'xxx' , &t_TI )
&t_TI = save_TI
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['&t_TI = 123' ], 'E1012:' )
v9 .CheckScriptFailure ( ['vim9script' , '&t_TI = 123' ], 'E928:' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var s:var = 123' ], 'E1101:' )
v9 .CheckDefFailure ( ['var s:var: number' ], 'E1101:' )
2020-09-21 22:21:42 +02:00
lines = < < trim END
vim9script
def SomeFunc ( )
s :var = 123
enddef
defcompile
END
2022-02-22 20:43:36 +00:00
v9 .CheckScriptFailure ( lines , 'E1268:' )
2020-09-21 22:21:42 +02:00
g :inc_counter + = 1
assert_equal ( 2 , g :inc_counter )
2021-08-02 21:55:15 +02:00
if has ( 'float' )
var f : float
f + = 1
assert_equal ( 1 .0 , f )
endif
2020-09-21 22:21:42 +02:00
$SOME_ENV_VAR ..= 'more'
assert_equal ( 'somemore' , $SOME_ENV_VAR )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['$SOME_ENV_VAR += "more"' ], 'E1051:' )
v9 .CheckDefFailure ( ['$SOME_ENV_VAR += 123' ], 'E1012:' )
2020-09-21 22:21:42 +02:00
v :errmsg = 'none'
v :errmsg ..= 'again'
assert_equal ( 'noneagain' , v :errmsg )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['v:errmsg += "more"' ], 'E1051:' )
v9 .CheckDefFailure ( ['v:errmsg += 123' ], 'E1012:' )
2020-09-21 22:21:42 +02:00
2020-10-12 20:31:26 +02:00
var text = < < trim END
some text
END
2020-09-21 22:21:42 +02:00
enddef
2021-08-05 19:01:17 +02:00
def Test_float_and_number ( )
if ! has ( 'float' )
MissingFeature float
else
var lines = < < trim END
var f : float
f + = 2
f - = 1
assert_equal ( 1 .0 , f )
+ + f
- - f
assert_equal ( 1 .0 , f )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-08-05 19:01:17 +02:00
endif
enddef
2021-07-31 22:51:10 +02:00
let g :someNumber = 43
def Test_assign_concat ( )
var lines = < < trim END
var s = '-'
s ..= 99
s ..= true
s ..= '-'
s ..= v :null
s ..= g :someNumber
assert_equal ( '-99true-null43' , s )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-07-31 22:51:10 +02:00
lines = < < trim END
var s = '-'
s ..= [1 , 2 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105: Cannot convert list to string' , 'E734: Wrong variable type for .=' ], 2 )
2021-07-31 22:51:10 +02:00
lines = < < trim END
var s = '-'
s ..= {a : 2 }
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105: Cannot convert dict to string' , 'E734: Wrong variable type for .=' ], 2 )
2021-07-31 22:51:10 +02:00
enddef
2021-06-26 13:28:35 +02:00
def Test_assign_register ( )
var lines = < < trim END
@c = 'areg'
@c ..= 'add'
assert_equal ( 'aregadd' , @c )
@@ = 'some text'
assert_equal ( 'some text' , getreg ( '"' ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-06-26 13:28:35 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['@a += "more"' ], 'E1051:' )
v9 .CheckDefFailure ( ['@a += 123' ], 'E1012:' )
2021-06-26 13:28:35 +02:00
enddef
2021-05-28 21:06:08 +02:00
def Test_reserved_name ( )
for name in ['true' , 'false' , 'null' ]
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ['var ' .. name .. ' = 0' ], 'E1034:' )
v9 .CheckDefExecAndScriptFailure ( ['var ' .. name .. ': bool' ], 'E1034:' )
2021-05-28 21:06:08 +02:00
endfor
enddef
2021-04-15 22:13:39 +02:00
def Test_skipped_assignment ( )
var lines = < < trim END
for x in []
var i : number = 1
while false
i + = 1
endwhile
endfor
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-04-15 22:13:39 +02:00
enddef
2021-11-26 17:36:51 +00:00
def Test_assign_keep_type ( )
var lines = < < trim END
vim9script
var l : list < number > = [123 ]
l = [123 ]
l - > add ( 'string' )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1012:' , 4 )
2021-11-26 17:36:51 +00:00
enddef
2020-12-07 21:49:52 +01:00
def Test_assign_unpack ( )
var lines = < < trim END
var v1 : number
var v2 : number
[v1 , v2 ] = [1 , 2 ]
assert_equal ( 1 , v1 )
assert_equal ( 2 , v2 )
2021-04-10 22:35:43 +02:00
[v1 , _ , v2 , _ ] = [1 , 99 , 2 , 77 ]
assert_equal ( 1 , v1 )
assert_equal ( 2 , v2 )
[v1 , v2 ; _ ] = [1 , 2 , 3 , 4 , 5 ]
assert_equal ( 1 , v1 )
assert_equal ( 2 , v2 )
2021-06-21 19:44:11 +02:00
2022-02-14 21:19:04 +00:00
var _x : number
[_x , v2 ] = [6 , 7 ]
assert_equal ( 6 , _x )
assert_equal ( 7 , v2 )
2021-06-26 13:59:29 +02:00
var reslist = []
for text in ['aaa {bbb} ccc' , 'ddd {eee} fff' ]
var before : string
var middle : string
var after : string
[_ , before , middle , after ; _ ] = text - > matchlist ( '\(.\{-\}\){\(.\{-\}\)}\(.*\)' )
reslist - > add ( before ) - > add ( middle ) - > add ( after )
endfor
assert_equal ( ['aaa ' , 'bbb' , ' ccc' , 'ddd ' , 'eee' , ' fff' ], reslist )
2021-06-21 19:44:11 +02:00
var a = 1
var b = 3
[a , b ] + = [2 , 4 ]
assert_equal ( 3 , a )
assert_equal ( 7 , b )
[a , b ] - = [1 , 2 ]
assert_equal ( 2 , a )
assert_equal ( 5 , b )
[a , b ] *= [3 , 2 ]
assert_equal ( 6 , a )
assert_equal ( 10 , b )
[a , b ] /= [2 , 4 ]
assert_equal ( 3 , a )
assert_equal ( 2 , b )
[a , b ] = [17 , 15 ]
[a , b ] %= [5 , 3 ]
assert_equal ( 2 , a )
assert_equal ( 0 , b )
2020-12-07 21:49:52 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-12-07 21:49:52 +01:00
2021-12-01 17:38:01 +00:00
lines = < < trim END
var v1 : number
var v2 : number
[v1 , v2 ] = [1 , 2 , 3 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1093: Expected 2 items but got 3' , 3 )
2021-12-01 17:38:01 +00:00
lines = < < trim END
var v1 : number
var v2 : number
[v1 , v2 ] = [1 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1093: Expected 2 items but got 1' , 3 )
2021-12-01 17:38:01 +00:00
lines = < < trim END
var v1 : number
var v2 : number
[v1 , v2 ; _ ] = [1 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1093: Expected 2 items but got 1' , 3 )
2021-12-01 17:38:01 +00:00
2020-12-07 21:49:52 +01:00
lines = < < trim END
var v1 : number
var v2 : number
[v1 , v2 ] =
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1097:' , 5 )
2020-12-07 21:49:52 +01:00
lines = < < trim END
var v1 : number
var v2 : number
[v1 , v2 ] = xxx
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1001:' , 3 )
2020-12-07 21:49:52 +01:00
lines = < < trim END
var v1 : number
var v2 : number
[v1 , v2 ] = popup_clear ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1031:' , 3 )
2020-12-07 21:49:52 +01:00
2021-01-01 21:05:55 +01:00
lines = < < trim END
[v1 , v2 ] = [1 , 2 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1089' , 1 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E1089' , 2 )
2021-01-01 21:05:55 +01:00
2020-12-07 21:49:52 +01:00
lines = < < trim END
var v1 : number
var v2 : number
[v1 , v2 ] = ''
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1012: Type mismatch; expected list<any> but got string' , 3 )
2021-02-11 21:19:34 +01:00
lines = < < trim END
g :values = [false , 0 ]
var x : bool
var y : string
[x , y ] = g :values
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1163: Variable 2: type mismatch, expected string but got number' )
2021-08-07 16:30:42 +02:00
lines = < < trim END
var x : number
var y : number
var z : string
[x , y , z ] = [1 , 2 , 3 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1163: Variable 3: type mismatch, expected string but got number' )
2021-08-07 16:30:42 +02:00
lines = < < trim END
var x : number
var y : string
var z : string
[x , y , z ] = [1 , '2' , 3 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1163: Variable 3: type mismatch, expected string but got number' )
2020-12-07 21:49:52 +01:00
enddef
2020-12-02 15:11:18 +01:00
def Test_assign_linebreak ( )
var nr : number
nr =
123
assert_equal ( 123 , nr )
var n2 : number
[nr , n2 ] =
[12 , 34 ]
assert_equal ( 12 , nr )
assert_equal ( 34 , n2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ["var x = #" ], 'E1097:' , 3 )
2021-04-03 21:01:01 +02:00
var lines = < < trim END
var x : list < string > = ['a' ]
var y : list < number > = x
- > copy ( )
- > copy ( )
END
2022-02-02 20:01:27 +00:00
v9 .CheckDefExecFailure ( lines , 'E1012:' , 4 )
2021-07-04 22:48:12 +02:00
lines = < < trim END
var x : any
x .key = 1
+ 2
+ 3
+ 4
+ 5
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1148:' , 'E1203:' ], 2 )
2020-12-02 15:11:18 +01:00
enddef
2020-11-28 18:52:33 +01:00
def Test_assign_index ( )
# list of list
var l1 : list < number >
l1 [0 ] = 123
assert_equal ( [123 ], l1 )
var l2 : list < list < number > >
l2 [0 ] = []
l2 [0 ][0 ] = 123
assert_equal ( [[123 ]], l2 )
var l3 : list < list < list < number > > >
l3 [0 ] = []
l3 [0 ][0 ] = []
l3 [0 ][0 ][0 ] = 123
assert_equal ( [[[123 ]]], l3 )
var lines = < < trim END
var l3 : list < list < number > >
l3 [0 ] = []
l3 [0 ][0 ] = []
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1012: Type mismatch; expected number but got list<unknown>' , 3 )
2020-11-28 18:52:33 +01:00
# dict of dict
var d1 : dict < number >
d1 .one = 1
assert_equal ( {one : 1 }, d1 )
var d2 : dict < dict < number > >
d2 .one = {}
d2 .one .two = 123
assert_equal ( {one : {two : 123 }}, d2 )
var d3 : dict < dict < dict < number > > >
d3 .one = {}
d3 .one .two = {}
d3 .one .two .three = 123
assert_equal ( {one : {two : {three : 123 }}}, d3 )
2022-02-17 13:08:26 +00:00
# blob
var bl : blob = 0 z11223344
bl [0 ] = 0 x77
assert_equal ( 0 z77223344 , bl )
bl [-2 ] = 0 x66
assert_equal ( 0 z77226644 , bl )
2022-02-28 20:55:02 +00:00
lines = < < trim END
g :val = '22'
var bl = 0 z11
bl [1 ] = g :val
END
v9 .CheckDefExecAndScriptFailure ( lines , 'E1030: Using a String as a Number: "22"' )
2021-08-01 13:17:17 +02:00
# should not read the next line when generating "a.b"
var a = {}
a .b = {}
a .b .c = {}
- > copy ( )
2020-11-28 18:52:33 +01:00
lines = < < trim END
var d3 : dict < dict < number > >
d3 .one = {}
d3 .one .two = {}
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1012: Type mismatch; expected number but got dict<unknown>' , 3 )
2020-11-28 18:52:33 +01:00
2020-12-13 18:44:43 +01:00
lines = < < trim END
var lines : list < string >
lines ['a' ] = 'asdf'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1012:' , 2 )
2020-12-13 18:44:43 +01:00
lines = < < trim END
var lines : string
lines [9 ] = 'asdf'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1141:' , 2 )
2020-12-13 18:44:43 +01:00
2020-11-28 18:52:33 +01:00
# list of dict
var ld : list < dict < number > >
ld [0 ] = {}
ld [0 ].one = 123
assert_equal ( [{one : 123 }], ld )
lines = < < trim END
var ld : list < dict < number > >
ld [0 ] = []
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1012: Type mismatch; expected dict<number> but got list<unknown>' , 2 )
2020-11-28 18:52:33 +01:00
# dict of list
var dl : dict < list < number > >
dl .one = []
dl .one [0 ] = 123
assert_equal ( {one : [123 ]}, dl )
lines = < < trim END
var dl : dict < list < number > >
dl .one = {}
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1012: Type mismatch; expected list<number> but got dict<unknown>' , 2 )
2022-02-17 13:08:26 +00:00
lines = < < trim END
g :l = [1 , 2 ]
g :l ['x' ] = 3
END
v9 .CheckDefExecAndScriptFailure ( lines , ['E39:' , 'E1030:' ], 2 )
lines = < < trim END
var bl : blob = test_null_blob ( )
bl [1 ] = 8
END
v9 .CheckDefExecAndScriptFailure ( lines , ['E1184:' , 'E979:' ], 2 )
2022-02-17 14:42:02 +00:00
lines = < < trim END
g :bl = 'not a blob'
g :bl [1 : 2 ] = 8
END
v9 .CheckDefExecAndScriptFailure ( lines , ['E897:' , 'E689:' ], 2 )
2020-11-28 18:52:33 +01:00
enddef
2022-01-15 21:44:44 +00:00
def Test_init_in_for_loop ( )
var lines = < < trim END
var l : list < number > = []
for i in [3 , 4 ]
var n : number
add ( l , n )
n = 123
endfor
assert_equal ( [0 , 0 ], l )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2022-01-15 21:44:44 +00:00
lines = < < trim END
var l : list < number > = []
for i in [3 , 4 ]
var n : number = 0
add ( l , n )
n = 123
endfor
assert_equal ( [0 , 0 ], l )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2022-01-15 21:44:44 +00:00
lines = < < trim END
var l : list < number > = []
for i in [3 , 4 ]
var n : number = 3
add ( l , n )
n = 123
endfor
assert_equal ( [3 , 3 ], l )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2022-01-15 21:44:44 +00:00
enddef
2020-09-23 15:56:50 +02:00
def Test_extend_list ( )
2020-09-26 15:09:30 +02:00
var lines = < < trim END
2021-09-09 23:01:14 +02:00
var l1 : list < number >
var l2 = l1
assert_true ( l1 is l2 )
l1 + = [123 ]
assert_equal ( [123 ], l1 )
assert_true ( l1 is l2 )
2020-11-04 11:36:35 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-09-23 15:56:50 +02:00
2020-11-04 11:36:35 +01:00
lines = < < trim END
var list : list < string >
extend ( list , ['x' ])
assert_equal ( ['x' ], list )
2020-09-23 15:56:50 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-10 15:37:58 +02:00
# appending to NULL list from a function
lines = < < trim END
vim9script
var list : list < string >
def Func ( )
list + = ['a' , 'b' ]
enddef
Func ( )
assert_equal ( ['a' , 'b' ], list )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-12-18 17:23:14 +01:00
lines = < < trim END
vim9script
var list : list < string >
def Func ( )
extend ( list , ['x' , 'b' ])
enddef
Func ( )
assert_equal ( ['x' , 'b' ], list )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-11-04 11:36:35 +01:00
lines = < < trim END
vim9script
var l : list < string > = test_null_list ( )
extend ( l , ['x' ])
assert_equal ( ['x' ], l )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-11-04 11:36:35 +01:00
lines = < < trim END
vim9script
extend ( test_null_list ( ) , ['x' ])
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1134:' , 2 )
2022-01-04 15:17:03 +00:00
# using global var has no declared type
g :myList = []
g :myList - > extend ( [1 ])
g :myList - > extend ( ['x' ])
assert_equal ( [1 , 'x' ], g :myList )
unlet g :myList
# using declared list gives an error
lines = < < trim END
var l : list < number >
g :myList = l
g :myList - > extend ( [1 ])
g :myList - > extend ( ['x' ])
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>' , 4 )
2022-01-04 15:17:03 +00:00
unlet g :myList
2022-02-06 17:17:02 +00:00
lines = < < trim END
vim9script
var lds = [1 , 2 , 3 ]
def Func ( )
echo lds - > extend ( ['x' ])
enddef
defcompile
END
v9 .CheckScriptFailure ( lines , 'E1013:' )
2020-11-04 11:36:35 +01:00
enddef
def Test_extend_dict ( )
var lines = < < trim END
vim9script
var d : dict < number >
2020-12-02 17:36:54 +01:00
extend ( d , {a : 1 })
assert_equal ( {a : 1 }, d )
2020-11-04 11:36:35 +01:00
var d2 : dict < number >
d2 ['one' ] = 1
2020-12-02 17:36:54 +01:00
assert_equal ( {one : 1 }, d2 )
2020-11-04 11:36:35 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-11-04 11:36:35 +01:00
lines = < < trim END
vim9script
var d : dict < string > = test_null_dict ( )
2020-12-02 17:36:54 +01:00
extend ( d , {a : 'x' })
assert_equal ( {a : 'x' }, d )
2020-11-04 11:36:35 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-11-04 11:36:35 +01:00
lines = < < trim END
vim9script
2020-12-02 17:36:54 +01:00
extend ( test_null_dict ( ) , {a : 'x' })
2020-11-04 11:36:35 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1133:' , 2 )
2020-09-23 15:56:50 +02:00
enddef
2020-09-21 22:21:42 +02:00
def Test_single_letter_vars ( )
# single letter variables
2020-09-26 15:09:30 +02:00
var a : number = 123
2020-09-21 22:21:42 +02:00
a = 123
assert_equal ( 123 , a )
2020-09-26 15:09:30 +02:00
var b : number
2020-09-21 22:21:42 +02:00
b = 123
assert_equal ( 123 , b )
2020-09-26 15:09:30 +02:00
var g : number
2020-09-21 22:21:42 +02:00
g = 123
assert_equal ( 123 , g )
2020-09-26 15:09:30 +02:00
var s : number
2020-09-21 22:21:42 +02:00
s = 123
assert_equal ( 123 , s )
2020-09-26 15:09:30 +02:00
var t : number
2020-09-21 22:21:42 +02:00
t = 123
assert_equal ( 123 , t )
2020-09-26 15:09:30 +02:00
var v : number
2020-09-21 22:21:42 +02:00
v = 123
assert_equal ( 123 , v )
2020-09-26 15:09:30 +02:00
var w : number
2020-09-21 22:21:42 +02:00
w = 123
assert_equal ( 123 , w )
enddef
def Test_vim9_single_char_vars ( )
2020-09-26 15:09:30 +02:00
var lines = < < trim END
2020-09-21 22:21:42 +02:00
vim9script
# single character variable declarations work
2020-09-26 15:09:30 +02:00
var a : string
var b : number
var l : list < any >
var s : string
var t : number
var v : number
var w : number
2020-09-21 22:21:42 +02:00
# script - local variables can be used without s : prefix
a = 'script-a'
b = 111
l = [1 , 2 , 3 ]
s = 'script-s'
t = 222
v = 333
w = 444
assert_equal ( 'script-a' , a )
assert_equal ( 111 , b )
assert_equal ( [1 , 2 , 3 ], l )
assert_equal ( 'script-s' , s )
assert_equal ( 222 , t )
assert_equal ( 333 , v )
assert_equal ( 444 , w )
END
writefile ( lines , 'Xsinglechar' )
source Xsinglechar
delete ( 'Xsinglechar' )
enddef
def Test_assignment_list ( )
2020-09-26 15:09:30 +02:00
var list1 : list < bool > = [false , true , false ]
var list2 : list < number > = [1 , 2 , 3 ]
var list3 : list < string > = ['sdf' , 'asdf' ]
var list4 : list < any > = ['yes' , true , 1234 ]
var list5 : list < blob > = [0 z01 , 0 z02 ]
2020-09-21 22:21:42 +02:00
2020-09-26 15:09:30 +02:00
var listS : list < string > = []
var listN : list < number > = []
2020-09-21 22:21:42 +02:00
assert_equal ( [1 , 2 , 3 ], list2 )
list2 [-1 ] = 99
assert_equal ( [1 , 2 , 99 ], list2 )
list2 [-2 ] = 88
assert_equal ( [1 , 88 , 99 ], list2 )
list2 [-3 ] = 77
assert_equal ( [77 , 88 , 99 ], list2 )
list2 + = [100 ]
assert_equal ( [77 , 88 , 99 , 100 ], list2 )
list3 + = ['end' ]
assert_equal ( ['sdf' , 'asdf' , 'end' ], list3 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ['var ll = [1, 2, 3]' , 'll[-4] = 6' ], 'E684:' )
2022-02-17 16:30:11 +00:00
v9 .CheckDefExecFailure ( ['var ll = [1, 2, 3]' , 'unlet ll[8 : 9]' ], 'E684:' )
v9 .CheckDefExecFailure ( ['var ll = [1, 2, 3]' , 'unlet ll[1 : -9]' ], 'E684:' )
v9 .CheckDefExecFailure ( ['var ll = [1, 2, 3]' , 'unlet ll[2 : 1]' ], 'E684:' )
2020-09-21 22:21:42 +02:00
# type becomes list < any >
2020-09-26 15:09:30 +02:00
var somelist = rand ( ) > 0 ? [1 , 2 , 3 ] : ['a' , 'b' , 'c' ]
2020-12-21 17:30:50 +01:00
2022-01-03 12:28:03 +00:00
# type is list < any > even though initializer is list < number >
var anyList : list < any > = [0 ]
assert_equal ( [0 , 'x' ], extend ( anyList , ['x' ]) )
2020-12-21 17:30:50 +01:00
var lines = < < trim END
var d = {dd : test_null_list ( ) }
d .dd [0 ] = 0
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1147:' , 2 )
2021-07-04 15:54:08 +02:00
lines = < < trim END
def OneArg ( x : bool )
enddef
def TwoArgs ( x : bool , y : bool )
enddef
var fl : list < func ( bool , bool , bool ) > = [OneArg , TwoArgs ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1012:' , 5 )
2020-09-21 22:21:42 +02:00
enddef
2021-11-30 16:14:49 +00:00
def Test_list_declaration ( )
var [v1 , v2 ] = [1 , 2 ]
v1 + = 3
assert_equal ( 4 , v1 )
v2 *= 3
assert_equal ( 6 , v2 )
var lines = < < trim END
var [v1 , v2 ] = [1 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1093: Expected 2 items but got 1' , 'E688:' ])
2021-11-30 16:14:49 +00:00
lines = < < trim END
var testlist = [1 ]
var [v1 , v2 ] = testlist
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1093: Expected 2 items but got 1' , 'E688:' ])
2021-11-30 16:14:49 +00:00
lines = < < trim END
var [v1 , v2 ] = [1 , 2 , 3 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1093: Expected 2 items but got 3' , 'E687:' ])
2021-11-30 16:14:49 +00:00
lines = < < trim END
var testlist = [1 , 2 , 3 ]
var [v1 , v2 ] = testlist
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1093: Expected 2 items but got 3' , 'E687:' ])
2021-11-30 16:14:49 +00:00
var [vnr , vstr ] = [123 , 'text' ]
vnr + = 3
assert_equal ( 126 , vnr )
vstr ..= 'end'
assert_equal ( 'textend' , vstr )
var [vnr2 : number , vstr2 : string ] = [123 , 'text' ]
vnr2 + = 3
assert_equal ( 126 , vnr2 )
vstr2 ..= 'end'
assert_equal ( 'textend' , vstr2 )
var [vnr3 : number ; vlist : list < string > ] = [123 , 'foo' , 'bar' ]
vnr3 + = 5
assert_equal ( 128 , vnr3 )
assert_equal ( ['foo' , 'bar' ], vlist )
lines = < < trim END
var [vnr2 : number , vstr2 : number ] = [123 , 'text' ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1163: Variable 2: type mismatch, expected number but got string' , 'E1012: Type mismatch; expected number but got string' ])
2021-11-30 16:14:49 +00:00
lines = < < trim END
var testlist = [234 , 'text' ]
var [vnr2 : number , vstr2 : number ] = testlist
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1163: Variable 2: type mismatch, expected number but got string' , 'E1012: Type mismatch; expected number but got string' ])
2021-11-30 16:14:49 +00:00
enddef
2021-07-04 20:20:52 +02:00
def PartFuncBool ( b : bool ) : string
2021-07-04 18:28:15 +02:00
return 'done'
enddef
def Test_assignment_partial ( )
2021-07-04 20:20:52 +02:00
var lines = < < trim END
2022-01-30 15:28:30 +00:00
var Partial : func ( ) : string = function ( g :PartFuncBool , [true ])
2021-07-04 20:20:52 +02:00
assert_equal ( 'done' , Partial ( ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-07-04 23:29:30 +02:00
lines = < < trim END
vim9script
def Func ( b : bool )
enddef
var Ref : func = function ( Func , [true ])
assert_equal ( 'func()' , typename ( Ref ) )
Ref ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-12-30 13:29:00 +00:00
lines = < < trim END
vim9script
var nres : any
var sres : any
2021-12-31 14:06:45 +00:00
def Func ( nr : number , s = '' )
nres = nr
2021-12-30 13:29:00 +00:00
sres = s
enddef
var n : number
var Ref = function ( Func , [n ])
Ref ( 'x' )
assert_equal ( 0 , nres )
assert_equal ( 'x' , sres )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-12-30 13:29:00 +00:00
lines = < < trim END
vim9script
2021-12-31 14:06:45 +00:00
def Func ( nr : number , s = '' )
2021-12-30 13:29:00 +00:00
enddef
var n : number
var Ref = function ( Func , [n ])
Ref ( 0 )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1013: Argument 2: type mismatch, expected string but got number' )
2021-07-04 18:28:15 +02:00
enddef
2021-01-17 21:51:24 +01:00
def Test_assignment_list_any_index ( )
var l : list < number > = [1 , 2 ]
for [x , y , _ ]
in [[0 , 1 , '' ], [1 , 3 , '' ]]
l [x ] = l [x ] + y
endfor
assert_equal ( [2 , 5 ], l )
enddef
2020-09-21 22:21:42 +02:00
def Test_assignment_list_vim9script ( )
2020-09-26 15:09:30 +02:00
var lines = < < trim END
2020-09-21 22:21:42 +02:00
vim9script
2020-09-26 15:09:30 +02:00
var v1 : number
var v2 : number
var v3 : number
2020-09-21 22:21:42 +02:00
[v1 , v2 , v3 ] = [1 , 2 , 3 ]
assert_equal ( [1 , 2 , 3 ], [v1 , v2 , v3 ])
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-21 22:21:42 +02:00
enddef
def Test_assignment_dict ( )
2020-12-02 17:36:54 +01:00
var dict1 : dict < bool > = {one : false , two : true }
var dict2 : dict < number > = {one : 1 , two : 2 }
var dict3 : dict < string > = {key : 'value' }
var dict4 : dict < any > = {one : 1 , two : '2' }
var dict5 : dict < blob > = {one : 0 z01 , two : 0 z02 }
2020-09-21 22:21:42 +02:00
# overwrite
dict3 ['key' ] = 'another'
2020-12-02 17:36:54 +01:00
assert_equal ( dict3 , {key : 'another' })
2020-11-16 22:11:49 +01:00
dict3 .key = 'yet another'
2020-12-02 17:36:54 +01:00
assert_equal ( dict3 , {key : 'yet another' })
2020-11-16 22:11:49 +01:00
2020-12-20 15:20:56 +01:00
# member "any" can also be a dict and assigned to
var anydict : dict < any > = {nest : {}, nr : 0 }
anydict .nest ['this' ] = 123
anydict .nest .that = 456
assert_equal ( {nest : {this : 123 , that : 456 }, nr : 0 }, anydict )
2020-11-16 22:11:49 +01:00
var lines = < < trim END
2020-12-20 14:49:42 +01:00
var dd = {}
dd .two = 2
assert_equal ( {two : 2 }, dd )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-12-21 17:30:50 +01:00
lines = < < trim END
var d = {dd : {}}
d .dd [0 ] = 2
d .dd ['x' ] = 3
d .dd .y = 4
assert_equal ( {dd : {0 : 2 , x : 3 , y : 4 }}, d )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-12-20 14:49:42 +01:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var dd = {one : 1 }
2020-11-16 22:11:49 +01:00
dd .one ) = 2
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E488:' , 2 )
2020-12-20 14:49:42 +01:00
lines = < < trim END
var dd = {one : 1 }
var dd .one = 2
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1017:' , 2 )
2020-09-21 22:21:42 +02:00
# empty key can be used
2020-09-26 15:09:30 +02:00
var dd = {}
2020-09-21 22:21:42 +02:00
dd ["" ] = 6
2020-12-02 17:36:54 +01:00
assert_equal ( {['' ]: 6 }, dd )
2020-09-21 22:21:42 +02:00
# type becomes dict < any >
2020-12-02 17:36:54 +01:00
var somedict = rand ( ) > 0 ? {a : 1 , b : 2 } : {a : 'a' , b : 'b' }
2020-09-21 22:21:42 +02:00
2022-01-03 12:28:03 +00:00
# type is dict < any > even though initializer is dict < number >
var anyDict : dict < any > = {a : 0 }
assert_equal ( {a : 0 , b : 'x' }, extend ( anyDict , {b : 'x' }) )
2022-01-04 15:17:03 +00:00
# using global var , which has no declared type
g :myDict = {}
g :myDict - > extend ( {a : 1 })
g :myDict - > extend ( {b : 'x' })
assert_equal ( {a : 1 , b : 'x' }, g :myDict )
unlet g :myDict
# using list with declared type gives an error
lines = < < trim END
var d : dict < number >
g :myDict = d
g :myDict - > extend ( {a : 1 })
g :myDict - > extend ( {b : 'x' })
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>' , 4 )
2022-01-04 15:17:03 +00:00
unlet g :myDict
2020-09-21 22:21:42 +02:00
# assignment to script - local dict
2020-11-16 22:11:49 +01:00
lines = < < trim END
2020-09-21 22:21:42 +02:00
vim9script
2020-09-26 15:09:30 +02:00
var test : dict < any > = {}
2020-09-21 22:21:42 +02:00
def FillDict ( ) : dict < any >
test ['a' ] = 43
return test
enddef
2020-12-02 17:36:54 +01:00
assert_equal ( {a : 43 }, FillDict ( ) )
2020-09-21 22:21:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-21 22:21:42 +02:00
lines = < < trim END
vim9script
2020-09-26 15:09:30 +02:00
var test : dict < any >
2020-09-21 22:21:42 +02:00
def FillDict ( ) : dict < any >
test ['a' ] = 43
return test
enddef
FillDict ( )
2020-12-18 17:23:14 +01:00
assert_equal ( {a : 43 }, test )
2020-09-21 22:21:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-21 22:21:42 +02:00
# assignment to global dict
lines = < < trim END
vim9script
g :test = {}
def FillDict ( ) : dict < any >
g :test ['a' ] = 43
return g :test
enddef
2020-12-02 17:36:54 +01:00
assert_equal ( {a : 43 }, FillDict ( ) )
2020-09-21 22:21:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-21 22:21:42 +02:00
# assignment to buffer dict
lines = < < trim END
vim9script
b :test = {}
def FillDict ( ) : dict < any >
b :test ['a' ] = 43
return b :test
enddef
2020-12-02 17:36:54 +01:00
assert_equal ( {a : 43 }, FillDict ( ) )
2020-09-21 22:21:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-12-21 17:30:50 +01:00
lines = < < trim END
var d = {dd : test_null_dict ( ) }
d .dd [0 ] = 0
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1103:' , 2 )
2020-12-21 17:30:50 +01:00
lines = < < trim END
var d = {dd : 'string' }
d .dd [0 ] = 0
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1148:' , 2 )
2021-06-26 15:00:59 +02:00
lines = < < trim END
var n : any
n .key = 5
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1148:' , 'E1203: Dot can only be used on a dictionary: n.key = 5' ], 2 )
2020-09-21 22:21:42 +02:00
enddef
def Test_assignment_local ( )
# Test in a separated file in order not to the current buffer /window/ tab is
# changed .
2020-09-26 15:09:30 +02:00
var script_lines : list < string > = < < trim END
2020-09-21 22:21:42 +02:00
let b :existing = 'yes'
let w :existing = 'yes'
let t :existing = 'yes'
def Test_assignment_local_internal ( )
b :newvar = 'new'
assert_equal ( 'new' , b :newvar )
assert_equal ( 'yes' , b :existing )
b :existing = 'no'
assert_equal ( 'no' , b :existing )
b :existing ..= 'NO'
assert_equal ( 'noNO' , b :existing )
w :newvar = 'new'
assert_equal ( 'new' , w :newvar )
assert_equal ( 'yes' , w :existing )
w :existing = 'no'
assert_equal ( 'no' , w :existing )
w :existing ..= 'NO'
assert_equal ( 'noNO' , w :existing )
t :newvar = 'new'
assert_equal ( 'new' , t :newvar )
assert_equal ( 'yes' , t :existing )
t :existing = 'no'
assert_equal ( 'no' , t :existing )
t :existing ..= 'NO'
assert_equal ( 'noNO' , t :existing )
enddef
call Test_assignment_local_internal ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( script_lines )
2020-09-21 22:21:42 +02:00
enddef
def Test_assignment_default ( )
# Test default values .
2020-09-26 15:09:30 +02:00
var thebool : bool
2020-09-21 22:21:42 +02:00
assert_equal ( v :false , thebool )
2020-09-26 15:09:30 +02:00
var thenumber : number
2020-09-21 22:21:42 +02:00
assert_equal ( 0 , thenumber )
if has ( 'float' )
2020-09-26 15:09:30 +02:00
var thefloat : float
2020-09-21 22:21:42 +02:00
assert_equal ( 0 .0 , thefloat )
endif
2020-09-26 15:09:30 +02:00
var thestring : string
2020-09-21 22:21:42 +02:00
assert_equal ( '' , thestring )
2020-09-26 15:09:30 +02:00
var theblob : blob
2020-09-21 22:21:42 +02:00
assert_equal ( 0 z, theblob )
2020-09-26 15:09:30 +02:00
var Thefunc : func
2020-09-21 22:21:42 +02:00
assert_equal ( test_null_function ( ) , Thefunc )
2020-09-26 15:09:30 +02:00
var thelist : list < any >
2020-09-21 22:21:42 +02:00
assert_equal ( [], thelist )
2020-09-26 15:09:30 +02:00
var thedict : dict < any >
2020-09-21 22:21:42 +02:00
assert_equal ( {}, thedict )
if has ( 'channel' )
2020-09-26 15:09:30 +02:00
var thejob : job
2020-09-21 22:21:42 +02:00
assert_equal ( test_null_job ( ) , thejob )
2020-09-26 15:09:30 +02:00
var thechannel : channel
2020-09-21 22:21:42 +02:00
assert_equal ( test_null_channel ( ) , thechannel )
if has ( 'unix' ) && executable ( 'cat' )
# check with non - null job and channel , types must match
2020-12-02 17:36:54 +01:00
thejob = job_start ( "cat " , {})
2020-09-21 22:21:42 +02:00
thechannel = job_getchannel ( thejob )
job_stop ( thejob , 'kill' )
endif
endif
2020-09-26 15:09:30 +02:00
var nr = 1234 | nr = 5678
2020-09-21 22:21:42 +02:00
assert_equal ( 5678 , nr )
enddef
2022-02-17 13:08:26 +00:00
def Test_script_var_default ( )
var lines = < < trim END
vim9script
var l : list < number >
2022-02-28 20:55:02 +00:00
var li = [1 , 2 ]
2022-02-17 13:08:26 +00:00
var bl : blob
2022-02-28 20:55:02 +00:00
var bli = 0 z12
2022-02-17 13:08:26 +00:00
var d : dict < number >
2022-02-28 20:55:02 +00:00
var di = {'a' : 1 , 'b' : 2 }
2022-02-17 13:08:26 +00:00
def Echo ( )
assert_equal ( [], l )
2022-02-28 20:55:02 +00:00
assert_equal ( [1 , 2 ], li )
2022-02-17 13:08:26 +00:00
assert_equal ( 0 z, bl )
2022-02-28 20:55:02 +00:00
assert_equal ( 0 z12 , bli )
2022-02-17 13:08:26 +00:00
assert_equal ( {}, d )
2022-02-28 20:55:02 +00:00
assert_equal ( {'a' : 1 , 'b' : 2 }, di )
2022-02-17 13:08:26 +00:00
enddef
2022-02-17 14:42:02 +00:00
Echo ( )
2022-02-17 13:08:26 +00:00
END
v9 .CheckScriptSuccess ( lines )
enddef
2022-02-12 19:52:25 +00:00
let s :scriptvar = 'init'
2021-01-01 21:05:55 +01:00
2020-09-21 22:21:42 +02:00
def Test_assignment_var_list ( )
2020-11-30 21:12:19 +01:00
var lines = < < trim END
var v1 : string
var v2 : string
var vrem : list < string >
[v1 ] = ['aaa' ]
assert_equal ( 'aaa' , v1 )
[v1 , v2 ] = ['one' , 'two' ]
assert_equal ( 'one' , v1 )
assert_equal ( 'two' , v2 )
[v1 , v2 ; vrem ] = ['one' , 'two' ]
assert_equal ( 'one' , v1 )
assert_equal ( 'two' , v2 )
assert_equal ( [], vrem )
[v1 , v2 ; vrem ] = ['one' , 'two' , 'three' ]
assert_equal ( 'one' , v1 )
assert_equal ( 'two' , v2 )
assert_equal ( ['three' ], vrem )
[&ts , &sw ] = [3 , 4 ]
assert_equal ( 3 , &ts )
assert_equal ( 4 , &sw )
set ts = 8 sw = 4
2020-11-30 21:40:03 +01:00
[@a , @z ] = ['aa' , 'zz' ]
assert_equal ( 'aa' , @a )
assert_equal ( 'zz' , @z )
[$SOME_VAR , $OTHER_VAR ] = ['some' , 'other' ]
assert_equal ( 'some' , $SOME_VAR )
assert_equal ( 'other' , $OTHER_VAR )
2021-01-01 21:05:55 +01:00
[g :globalvar , b :bufvar , w :winvar , t :tabvar , v :errmsg ] =
['global' , 'buf' , 'win' , 'tab' , 'error' ]
2020-11-30 21:40:03 +01:00
assert_equal ( 'global' , g :globalvar )
assert_equal ( 'buf' , b :bufvar )
assert_equal ( 'win' , w :winvar )
assert_equal ( 'tab' , t :tabvar )
assert_equal ( 'error' , v :errmsg )
unlet g :globalvar
2020-11-30 21:12:19 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-01-01 21:05:55 +01:00
2022-02-12 19:52:25 +00:00
[g :globalvar , scriptvar , b :bufvar ] = ['global' , 'script' , 'buf' ]
2021-01-01 21:05:55 +01:00
assert_equal ( 'global' , g :globalvar )
2022-02-12 19:52:25 +00:00
assert_equal ( 'script' , scriptvar )
2021-01-01 21:05:55 +01:00
assert_equal ( 'buf' , b :bufvar )
lines = < < trim END
vim9script
2022-02-12 19:52:25 +00:00
var scriptvar = 'init'
[g :globalvar , scriptvar , w :winvar ] = ['global' , 'script' , 'win' ]
2021-01-01 21:05:55 +01:00
assert_equal ( 'global' , g :globalvar )
2022-02-12 19:52:25 +00:00
assert_equal ( 'script' , scriptvar )
2021-01-01 21:05:55 +01:00
assert_equal ( 'win' , w :winvar )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-21 22:21:42 +02:00
enddef
2022-02-03 12:34:05 +00:00
def Test_assignment_empty_list ( )
var lines = < < trim END
var l2 : list < any > = []
var l : list < string >
l = l2
END
v9 .CheckDefAndScriptSuccess ( lines )
enddef
2020-09-21 22:21:42 +02:00
def Test_assignment_vim9script ( )
2020-09-26 15:09:30 +02:00
var lines = < < trim END
2020-09-21 22:21:42 +02:00
vim9script
def Func ( ) : list < number >
return [1 , 2 ]
enddef
2020-09-27 21:58:45 +02:00
var name1 : number
var name2 : number
[name1 , name2 ] =
2020-09-21 22:21:42 +02:00
Func ( )
2020-09-27 21:58:45 +02:00
assert_equal ( 1 , name1 )
assert_equal ( 2 , name2 )
2020-09-26 15:09:30 +02:00
var ll =
2020-09-21 22:21:42 +02:00
Func ( )
assert_equal ( [1 , 2 ], ll )
@/ = 'text'
assert_equal ( 'text' , @/)
@0 = 'zero'
assert_equal ( 'zero' , @0 )
@1 = 'one'
assert_equal ( 'one' , @1 )
@9 = 'nine'
assert_equal ( 'nine' , @9 )
@- = 'minus'
assert_equal ( 'minus' , @- )
if has ( 'clipboard_working' )
@* = 'star'
assert_equal ( 'star' , @*)
@+ = 'plus'
assert_equal ( 'plus' , @+ )
endif
2020-09-26 15:09:30 +02:00
var a : number = 123
2020-09-21 22:21:42 +02:00
assert_equal ( 123 , a )
2020-09-26 15:09:30 +02:00
var s : string = 'yes'
2020-09-21 22:21:42 +02:00
assert_equal ( 'yes' , s )
2020-09-26 15:09:30 +02:00
var b : number = 42
2020-09-21 22:21:42 +02:00
assert_equal ( 42 , b )
2020-09-26 15:09:30 +02:00
var w : number = 43
2020-09-21 22:21:42 +02:00
assert_equal ( 43 , w )
2020-09-26 15:09:30 +02:00
var t : number = 44
2020-09-21 22:21:42 +02:00
assert_equal ( 44 , t )
2020-10-16 19:56:12 +02:00
var to_var = 0
to_var = 3
assert_equal ( 3 , to_var )
2020-09-21 22:21:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-27 21:27:40 +02:00
lines = < < trim END
vim9script
var n : number
def Func ( )
n = 'string'
enddef
defcompile
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1012: Type mismatch; expected number but got string' )
2020-09-21 22:21:42 +02:00
enddef
def Mess ( ) : string
v :foldstart = 123
return 'xxx'
enddef
def Test_assignment_failure ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var name=234' ], 'E1004:' )
v9 .CheckDefFailure ( ['var name =234' ], 'E1004:' )
v9 .CheckDefFailure ( ['var name= 234' ], 'E1004:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var name=234' ], 'E1004:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var name=234' ], "before and after '='" )
v9 .CheckScriptFailure ( ['vim9script' , 'var name =234' ], 'E1004:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var name= 234' ], 'E1004:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var name = 234' , 'name+=234' ], 'E1004:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var name = 234' , 'name+=234' ], "before and after '+='" )
v9 .CheckScriptFailure ( ['vim9script' , 'var name = "x"' , 'name..="y"' ], 'E1004:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var name = "x"' , 'name..="y"' ], "before and after '..='" )
v9 .CheckDefFailure ( ['var true = 1' ], 'E1034:' )
v9 .CheckDefFailure ( ['var false = 1' ], 'E1034:' )
v9 .CheckDefFailure ( ['var null = 1' ], 'E1034:' )
v9 .CheckDefFailure ( ['var this = 1' ], 'E1034:' )
2022-02-15 21:17:56 +00:00
v9 .CheckDefFailure ( ['[a; b; c] = g:list' ], 'E1001:' )
v9 .CheckDefFailure ( ['var [a; b; c] = g:list' ], 'E1080:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ['var a: number' ,
2020-09-21 22:21:42 +02:00
'[a] = test_null_list()' ], 'E1093:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ['var a: number' ,
2020-09-21 22:21:42 +02:00
'[a] = []' ], 'E1093:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ['var x: number' ,
2020-09-26 15:09:30 +02:00
'var y: number' ,
2020-09-21 22:21:42 +02:00
'[x, y] = [1]' ], 'E1093:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ['var x: string' ,
2020-10-17 22:04:08 +02:00
'var y: string' ,
'[x, y] = ["x"]' ], 'E1093:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ['var x: number' ,
2020-09-26 15:09:30 +02:00
'var y: number' ,
'var z: list<number>' ,
2020-09-21 22:21:42 +02:00
'[x, y; z] = [1]' ], 'E1093:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var somevar' ], "E1022:" )
v9 .CheckDefFailure ( ['var &tabstop = 4' ], 'E1052:' )
v9 .CheckDefFailure ( ['&g:option = 5' ], 'E113:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var &tabstop = 4' ], 'E1052:' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var $VAR = 5' ], 'E1016: Cannot declare an environment variable:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var $ENV = "xxx"' ], 'E1016:' )
2020-09-21 22:21:42 +02:00
if has ( 'dnd' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var @~ = 5' ], 'E1066:' )
2020-09-21 22:21:42 +02:00
else
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var @~ = 5' ], 'E354:' )
v9 .CheckDefFailure ( ['@~ = 5' ], 'E354:' )
2020-09-21 22:21:42 +02:00
endif
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var @a = 5' ], 'E1066:' )
v9 .CheckDefFailure ( ['var @/ = "x"' ], 'E1066:' )
v9 .CheckScriptFailure ( ['vim9script' , 'var @a = "abc"' ], 'E1066:' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var g:var = 5' ], 'E1016: Cannot declare a global variable:' )
v9 .CheckDefFailure ( ['var w:var = 5' ], 'E1016: Cannot declare a window variable:' )
v9 .CheckDefFailure ( ['var b:var = 5' ], 'E1016: Cannot declare a buffer variable:' )
v9 .CheckDefFailure ( ['var t:var = 5' ], 'E1016: Cannot declare a tab variable:' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var anr = 4' , 'anr ..= "text"' ], 'E1019:' )
v9 .CheckDefFailure ( ['var xnr += 4' ], 'E1020:' , 1 )
v9 .CheckScriptFailure ( ['vim9script' , 'var xnr += 4' ], 'E1020:' )
v9 .CheckDefFailure ( ["var xnr = xnr + 1" ], 'E1001:' , 1 )
v9 .CheckScriptFailure ( ['vim9script' , 'var xnr = xnr + 4' ], 'E121:' )
2020-09-21 22:21:42 +02:00
2022-02-12 19:52:25 +00:00
v9 .CheckScriptFailure ( ['vim9script' , 'def Func()' , 'var dummy = notfound' , 'enddef' , 'defcompile' ], 'E1001:' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var name: list<string> = [123]' ], 'expected list<string> but got list<number>' )
v9 .CheckDefFailure ( ['var name: list<number> = ["xx"]' ], 'expected list<number> but got list<string>' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var name: dict<string> = {key: 123}' ], 'expected dict<string> but got dict<number>' )
v9 .CheckDefFailure ( ['var name: dict<number> = {key: "xx"}' ], 'expected dict<number> but got dict<string>' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var name = feedkeys("0")' ], 'E1031:' )
v9 .CheckDefFailure ( ['var name: number = feedkeys("0")' ], 'expected number but got void' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var name: dict <number>' ], 'E1068:' )
v9 .CheckDefFailure ( ['var name: dict<number' ], 'E1009:' )
2020-09-21 22:21:42 +02:00
2022-01-30 15:28:30 +00:00
assert_fails ( 's/^/\=g:Mess()/n' , 'E794:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var name: dict<number' ], 'E1009:' )
2020-09-21 22:21:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['w:foo: number = 10' ],
2020-09-21 22:21:42 +02:00
'E488: Trailing characters: : number = 1' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['t:foo: bool = true' ],
2020-09-21 22:21:42 +02:00
'E488: Trailing characters: : bool = true' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['b:foo: string = "x"' ],
2020-09-21 22:21:42 +02:00
'E488: Trailing characters: : string = "x"' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['g:foo: number = 123' ],
2020-09-21 22:21:42 +02:00
'E488: Trailing characters: : number = 123' )
enddef
def Test_assign_list ( )
2021-06-27 15:04:05 +02:00
var lines = < < trim END
var l : list < string > = []
l [0 ] = 'value'
assert_equal ( 'value' , l [0 ])
l [1 ] = 'asdf'
assert_equal ( 'value' , l [0 ])
assert_equal ( 'asdf' , l [1 ])
assert_equal ( 'asdf' , l [-1 ])
assert_equal ( 'value' , l [-2 ])
var nrl : list < number > = []
for i in range ( 5 )
nrl [i ] = i
endfor
assert_equal ( [0 , 1 , 2 , 3 , 4 ], nrl )
var ul : list < any >
ul [0 ] = 1
ul [1 ] = 2
ul [2 ] = 3
assert_equal ( [1 , 2 , 3 ], ul )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-19 16:07:42 +02:00
2022-02-28 20:55:02 +00:00
lines = < < trim END
var l = [1 , 2 ]
g :idx = 'x'
l [g :idx : 1 ] = [0 ]
echo l
END
v9 .CheckDefExecAndScriptFailure ( lines , 'E1030: Using a String as a Number: "x"' )
lines = < < trim END
var l = [1 , 2 ]
g :idx = 3
l [g :idx : 1 ] = [0 ]
echo l
END
v9 .CheckDefExecAndScriptFailure ( lines , 'E684: list index out of range: 3' )
lines = < < trim END
var l = [1 , 2 ]
g :idx = 'y'
l [1 : g :idx ] = [0 ]
echo l
END
v9 .CheckDefExecAndScriptFailure ( lines , ['E1012: Type mismatch; expected number but got string' , 'E1030: Using a String as a Number: "y"' ])
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ["var l: list<number> = ['', true]" ], 'E1012: Type mismatch; expected list<number> but got list<any>' , 1 )
v9 .CheckDefFailure ( ["var l: list<list<number>> = [['', true]]" ], 'E1012: Type mismatch; expected list<list<number>> but got list<list<any>>' , 1 )
2020-09-21 22:21:42 +02:00
enddef
def Test_assign_dict ( )
2021-01-01 19:40:02 +01:00
var lines = < < trim END
var d : dict < string > = {}
d ['key' ] = 'value'
assert_equal ( 'value' , d ['key' ])
2020-09-21 22:21:42 +02:00
2021-01-01 19:40:02 +01:00
d [123 ] = 'qwerty'
assert_equal ( 'qwerty' , d [123 ])
assert_equal ( 'qwerty' , d ['123' ])
2020-09-21 22:21:42 +02:00
2021-01-01 19:40:02 +01:00
var nrd : dict < number > = {}
for i in range ( 3 )
nrd [i ] = i
endfor
assert_equal ( {0 : 0 , 1 : 1 , 2 : 2 }, nrd )
d .somekey = 'someval'
assert_equal ( {key : 'value' , '123' : 'qwerty' , somekey : 'someval' }, d )
unlet d .somekey
2021-08-03 21:16:18 +02:00
assert_equal ( {key : 'value' , '123' : 'qwerty' }, d )
2021-01-01 19:40:02 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-19 16:07:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ["var d: dict<number> = {a: '', b: true}" ], 'E1012: Type mismatch; expected dict<number> but got dict<any>' , 1 )
v9 .CheckDefFailure ( ["var d: dict<dict<number>> = {x: {a: '', b: true}}" ], 'E1012: Type mismatch; expected dict<dict<number>> but got dict<dict<any>>' , 1 )
2022-02-14 21:19:04 +00:00
v9 .CheckDefFailure ( ["var d = {x: 1}" , "d[1 : 2] = {y: 2}" ], 'E1165: Cannot use a range with an assignment: d[1 : 2] =' , 2 )
2020-09-21 22:21:42 +02:00
enddef
2020-09-23 13:25:32 +02:00
def Test_assign_dict_unknown_type ( )
2020-09-26 15:09:30 +02:00
var lines = < < trim END
2020-09-23 13:25:32 +02:00
vim9script
2020-09-26 15:09:30 +02:00
var mylist = []
2020-12-02 17:36:54 +01:00
mylist + = [{one : 'one' }]
2020-09-23 13:25:32 +02:00
def Func ( )
2020-09-26 15:09:30 +02:00
var dd = mylist [0 ]
2020-09-23 13:25:32 +02:00
assert_equal ( 'one' , dd .one )
enddef
Func ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-23 13:25:32 +02:00
2020-11-28 21:21:17 +01:00
lines = < < trim END
vim9script
var mylist = [[]]
2020-12-02 17:36:54 +01:00
mylist [0 ] + = [{one : 'one' }]
2020-11-28 21:21:17 +01:00
def Func ( )
var dd = mylist [0 ][0 ]
assert_equal ( 'one' , dd .one )
enddef
Func ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-23 13:25:32 +02:00
enddef
2021-03-03 17:58:16 +01:00
def Test_assign_dict_with_op ( )
var lines = < < trim END
var ds : dict < string > = {a : 'x' }
ds ['a' ] ..= 'y'
ds .a ..= 'z'
assert_equal ( 'xyz' , ds .a )
var dn : dict < number > = {a : 9 }
dn ['a' ] + = 2
assert_equal ( 11 , dn .a )
dn .a + = 2
assert_equal ( 13 , dn .a )
dn ['a' ] - = 3
assert_equal ( 10 , dn .a )
dn .a - = 2
assert_equal ( 8 , dn .a )
dn ['a' ] *= 2
assert_equal ( 16 , dn .a )
dn .a *= 2
assert_equal ( 32 , dn .a )
dn ['a' ] /= 3
assert_equal ( 10 , dn .a )
dn .a /= 2
assert_equal ( 5 , dn .a )
dn ['a' ] %= 3
assert_equal ( 2 , dn .a )
dn .a %= 6
assert_equal ( 2 , dn .a )
2021-04-05 20:51:00 +02:00
var dd : dict < dict < list < any > > >
dd .a = {}
dd .a .b = [0 ]
dd .a .b + = [1 ]
assert_equal ( {a : {b : [0 , 1 ]}}, dd )
2021-04-05 21:05:26 +02:00
var dab = {a : ['b' ]}
dab .a [0 ] ..= 'c'
assert_equal ( {a : ['bc' ]}, dab )
2021-03-03 17:58:16 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-04-05 17:11:17 +02:00
enddef
def Test_assign_list_with_op ( )
var lines = < < trim END
var ls : list < string > = ['x' ]
ls [0 ] ..= 'y'
assert_equal ( 'xy' , ls [0 ])
var ln : list < number > = [9 ]
ln [0 ] + = 2
assert_equal ( 11 , ln [0 ])
ln [0 ] - = 3
assert_equal ( 8 , ln [0 ])
ln [0 ] *= 2
assert_equal ( 16 , ln [0 ])
ln [0 ] /= 3
assert_equal ( 5 , ln [0 ])
ln [0 ] %= 3
assert_equal ( 2 , ln [0 ])
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-04-05 17:11:17 +02:00
enddef
def Test_assign_with_op_fails ( )
var lines = < < trim END
var s = 'abc'
s [1 ] + = 'x'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1141:' , 'E689:' ], 2 )
2021-04-05 17:11:17 +02:00
lines = < < trim END
var s = 'abc'
s [1 ] ..= 'x'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1141:' , 'E689:' ], 2 )
2021-04-05 20:51:00 +02:00
lines = < < trim END
var dd : dict < dict < list < any > > >
dd .a = {}
dd .a .b + = [1 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E716:' , 3 )
2021-03-03 17:58:16 +01:00
enddef
2020-09-21 22:21:42 +02:00
def Test_assign_lambda ( )
# check if assign a lambda to a variable which type is func or any .
2020-09-26 15:09:30 +02:00
var lines = < < trim END
2020-09-21 22:21:42 +02:00
vim9script
2020-12-31 21:28:47 +01:00
var FuncRef = ( ) = > 123
2020-09-21 22:21:42 +02:00
assert_equal ( 123 , FuncRef ( ) )
2020-12-31 21:28:47 +01:00
var FuncRef_Func : func = ( ) = > 123
2020-09-21 22:21:42 +02:00
assert_equal ( 123 , FuncRef_Func ( ) )
2020-12-31 21:28:47 +01:00
var FuncRef_Any : any = ( ) = > 123
2020-09-21 22:21:42 +02:00
assert_equal ( 123 , FuncRef_Any ( ) )
2021-02-17 17:00:27 +01:00
var FuncRef_Number : func ( ) : number = ( ) = > 321
assert_equal ( 321 , FuncRef_Number ( ) )
2020-09-21 22:21:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-01-07 19:23:08 +01:00
lines = < < trim END
var Ref : func ( number )
Ref = ( j ) = > ! j
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012: Type mismatch; expected func(number) but got func(any): bool' )
2021-02-17 18:49:11 +01:00
lines = < < trim END
echo filter ( [1 , 2 , 3 ], ( _ , v : string ) = > v + 1 )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1051:' )
2020-09-21 22:21:42 +02:00
enddef
2020-09-27 14:22:48 +02:00
def Test_heredoc ( )
var lines = < < trim END # comment
text
END
assert_equal ( ['text' ], lines )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var lines =<< trim END X' , 'END' ], 'E488:' )
v9 .CheckDefFailure ( ['var lines =<< trim END " comment' , 'END' ], 'E488:' )
2020-09-27 18:24:03 +02:00
lines = < < trim [END ]
def Func ( )
var &lines = < < trim END
x
x
2020-12-13 17:50:20 +01:00
enddef
defcompile
[END ]
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1145: Missing heredoc end marker: END' )
2020-12-13 17:50:20 +01:00
delfunc ! g :Func
lines = < < trim [END ]
def Func ( )
var lines = < < trim END
x
x
2020-09-27 18:24:03 +02:00
x
x
x
x
x
x
enddef
call Func ( )
[END ]
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1145: Missing heredoc end marker: END' )
2020-12-05 13:41:01 +01:00
delfunc ! g :Func
2021-07-28 21:25:49 +02:00
lines = < < trim END
var lines : number = < < trim STOP
aaa
bbb
STOP
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012: Type mismatch; expected number but got list<string>' , 1 )
2020-09-27 14:22:48 +02:00
enddef
2020-12-08 11:29:40 +01:00
def Test_var_func_call ( )
2020-09-30 22:59:42 +02:00
var lines = < < trim END
vim9script
func GetValue ( )
if exists ( 'g:count' )
let g :count + = 1
else
let g :count = 1
endif
return 'this'
endfunc
var val : string = GetValue ( )
# env var is always a string
var env = $TERM
END
writefile ( lines , 'Xfinished' )
source Xfinished
# GetValue ( ) is not called during discovery phase
assert_equal ( 1 , g :count )
unlet g :count
delete ( 'Xfinished' )
enddef
2020-12-08 11:29:40 +01:00
def Test_var_missing_type ( )
2020-09-30 22:59:42 +02:00
var lines = < < trim END
vim9script
var name = g :unknown
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E121:' )
2020-09-30 22:59:42 +02:00
lines = < < trim END
vim9script
var nr : number = 123
var name = nr
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-30 22:59:42 +02:00
enddef
2020-12-08 11:29:40 +01:00
def Test_var_declaration ( )
2020-09-30 22:59:42 +02:00
var lines = < < trim END
vim9script
var name : string
g :var_uninit = name
name = 'text'
g :var_test = name
2022-02-12 19:52:25 +00:00
# prefixing s : is not allowed
name = 'prefixed'
g :var_prefixed = name
2020-09-30 22:59:42 +02:00
2020-12-08 22:08:51 +01:00
const FOO : number = 123
assert_equal ( 123 , FOO )
2020-12-22 21:19:39 +01:00
const FOOS = 'foos'
assert_equal ( 'foos' , FOOS )
final FLIST = [1 ]
assert_equal ( [1 ], FLIST )
FLIST [0 ] = 11
assert_equal ( [11 ], FLIST )
const g :FOO : number = 321
assert_equal ( 321 , g :FOO )
const g :FOOS = 'gfoos'
assert_equal ( 'gfoos' , g :FOOS )
final g :FLIST = [2 ]
assert_equal ( [2 ], g :FLIST )
g :FLIST [0 ] = 22
assert_equal ( [22 ], g :FLIST )
2021-04-01 19:42:48 +02:00
def SetGlobalConst ( )
const g :globConst = 123
enddef
SetGlobalConst ( )
assert_equal ( 123 , g :globConst )
assert_true ( islocked ( 'g:globConst' ) )
2020-12-22 21:19:39 +01:00
const w :FOO : number = 46
assert_equal ( 46 , w :FOO )
const w :FOOS = 'wfoos'
assert_equal ( 'wfoos' , w :FOOS )
final w :FLIST = [3 ]
assert_equal ( [3 ], w :FLIST )
w :FLIST [0 ] = 33
assert_equal ( [33 ], w :FLIST )
2020-12-08 22:08:51 +01:00
2020-09-30 22:59:42 +02:00
var s :other : number
other = 1234
g :other_var = other
2021-03-26 21:27:52 +01:00
var xyz : string # comment
2020-09-30 22:59:42 +02:00
# type is inferred
2022-02-12 19:52:25 +00:00
var dict = {['a' ]: 222 }
2020-09-30 22:59:42 +02:00
def GetDictVal ( key : any )
2022-02-12 19:52:25 +00:00
g :dict_val = dict [key ]
2020-09-30 22:59:42 +02:00
enddef
GetDictVal ( 'a' )
2021-01-11 21:20:18 +01:00
final adict : dict < string > = {}
def ChangeAdict ( )
adict .foo = 'foo'
enddef
ChangeAdict ( )
2020-09-30 22:59:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-30 22:59:42 +02:00
assert_equal ( '' , g :var_uninit )
assert_equal ( 'text' , g :var_test )
assert_equal ( 'prefixed' , g :var_prefixed )
assert_equal ( 1234 , g :other_var )
assert_equal ( 222 , g :dict_val )
unlet g :var_uninit
unlet g :var_test
unlet g :var_prefixed
unlet g :other_var
2021-04-03 19:32:44 +02:00
unlet g :globConst
2020-12-22 21:19:39 +01:00
unlet g :FOO
unlet g :FOOS
unlet g :FLIST
unlet w :FOO
unlet w :FOOS
unlet w :FLIST
2020-09-30 22:59:42 +02:00
enddef
2020-12-08 11:29:40 +01:00
def Test_var_declaration_fails ( )
2020-09-30 22:59:42 +02:00
var lines = < < trim END
vim9script
final var : string
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1125:' )
2020-09-30 22:59:42 +02:00
2020-12-22 21:19:39 +01:00
lines = < < trim END
vim9script
const g :constvar = 'string'
g :constvar = 'xx'
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E741:' )
2020-12-22 21:19:39 +01:00
unlet g :constvar
2021-04-02 14:35:15 +02:00
lines = < < trim END
vim9script
var name = 'one'
lockvar name
def SetLocked ( )
name = 'two'
enddef
SetLocked ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E741: Value is locked: name' , 1 )
2021-04-02 14:44:02 +02:00
lines = < < trim END
let s :legacy = 'one'
lockvar s :legacy
def SetLocked ( )
s :legacy = 'two'
enddef
call SetLocked ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E741: Value is locked: s:legacy' , 1 )
2021-04-02 14:35:15 +02:00
2021-04-01 19:42:48 +02:00
lines = < < trim END
vim9script
def SetGlobalConst ( )
const g :globConst = 123
enddef
SetGlobalConst ( )
g :globConst = 234
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E741: Value is locked: g:globConst' , 6 )
2021-04-01 19:42:48 +02:00
unlet g :globConst
2021-01-11 21:20:18 +01:00
lines = < < trim END
vim9script
const cdict : dict < string > = {}
def Change ( )
cdict .foo = 'foo'
enddef
defcompile
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E46:' )
2021-01-11 21:20:18 +01:00
2020-12-22 21:19:39 +01:00
lines = < < trim END
vim9script
final w :finalvar = [9 ]
w :finalvar = [8 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1122:' )
2020-12-22 21:19:39 +01:00
unlet w :finalvar
2020-09-30 22:59:42 +02:00
lines = < < trim END
vim9script
const var : string
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1021:' )
2020-09-30 22:59:42 +02:00
lines = < < trim END
vim9script
var 9 var: string
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E488:' )
2020-12-08 22:08:51 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var foo.bar = 2' ], 'E1087:' )
v9 .CheckDefFailure ( ['var foo[3] = 2' ], 'E1087:' )
v9 .CheckDefFailure ( ['const foo: number' ], 'E1021:' )
2020-09-30 22:59:42 +02:00
enddef
2022-02-15 15:37:11 +00:00
def Test_var_declaration_inferred ( )
# check that type is set on the list so that extend ( ) fails
var lines = < < trim END
vim9script
def GetList ( ) : list < number >
var l = [1 , 2 , 3 ]
return l
enddef
echo GetList ( ) - > extend ( ['x' ])
END
v9 .CheckScriptFailure ( lines , 'E1013:' , 6 )
enddef
2021-04-06 21:17:27 +02:00
def Test_script_local_in_legacy ( )
2022-02-12 19:52:25 +00:00
# OK to define script - local later but before compiling
2021-04-06 21:17:27 +02:00
var lines = < < trim END
def SetLater ( )
2022-02-12 19:52:25 +00:00
legvar = 'two'
2021-04-06 21:17:27 +02:00
enddef
2021-04-24 14:15:41 +02:00
let s :legvar = 'one'
2022-02-12 19:52:25 +00:00
defcompile
2021-04-06 21:17:27 +02:00
call SetLater ( )
2021-04-24 14:15:41 +02:00
call assert_equal ( 'two' , s :legvar )
2021-04-06 21:17:27 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-04-06 21:17:27 +02:00
# OK to leave out s : prefix when script - local already defined
lines = < < trim END
2021-04-24 14:15:41 +02:00
let s :legvar = 'one'
2021-04-06 21:17:27 +02:00
def SetNoPrefix ( )
2021-04-24 14:15:41 +02:00
legvar = 'two'
2021-04-06 21:17:27 +02:00
enddef
call SetNoPrefix ( )
2021-04-24 14:15:41 +02:00
call assert_equal ( 'two' , s :legvar )
2021-04-06 21:17:27 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-04-06 21:17:27 +02:00
2022-02-12 19:52:25 +00:00
# Not OK to leave out s : prefix when script - local defined after compiling
2021-04-06 21:17:27 +02:00
lines = < < trim END
def SetLaterNoPrefix ( )
2021-04-24 14:15:41 +02:00
legvar = 'two'
2021-04-06 21:17:27 +02:00
enddef
defcompile
2021-04-24 14:15:41 +02:00
let s :legvar = 'one'
2021-04-06 21:17:27 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E476:' , 1 )
2021-07-17 21:24:56 +02:00
edit ! Xfile
lines = < < trim END
var edit : bool
legacy edit
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-04-06 21:17:27 +02:00
enddef
2020-12-08 11:29:40 +01:00
def Test_var_type_check ( )
2020-09-30 22:59:42 +02:00
var lines = < < trim END
vim9script
var name : string
name = 1234
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1012:' )
2020-09-30 22:59:42 +02:00
lines = < < trim END
vim9script
var name :string
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1069:' )
2020-09-30 22:59:42 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ['var n:number = 42' ], 'E1069:' )
2021-08-23 22:22:45 +02:00
2020-09-30 22:59:42 +02:00
lines = < < trim END
vim9script
var name : asdf
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1010:' )
2020-09-30 22:59:42 +02:00
lines = < < trim END
vim9script
2022-02-12 19:52:25 +00:00
var l : list < number >
l = []
2020-09-30 22:59:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-30 22:59:42 +02:00
lines = < < trim END
vim9script
2022-02-12 19:52:25 +00:00
var d : dict < number >
d = {}
2020-09-30 22:59:42 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-07-15 19:23:18 +02:00
lines = < < trim END
vim9script
var d = {a : 1 , b : [2 ]}
def Func ( b : bool )
var l : list < number > = b ? d .b : [3 ]
enddef
defcompile
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-09-30 22:59:42 +02:00
enddef
let g :dict_number = #{one : 1 , two : 2 }
2020-12-08 11:29:40 +01:00
def Test_var_list_dict_type ( )
2020-09-30 22:59:42 +02:00
var ll : list < number >
ll = [1 , 2 , 2 , 3 , 3 , 3 ]- > uniq ( )
ll - > assert_equal ( [1 , 2 , 3 ])
var dd : dict < number >
dd = g :dict_number
dd - > assert_equal ( g :dict_number )
var lines = < < trim END
var ll : list < number >
ll = [1 , 2 , 3 ]- > map ( '"one"' )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1012: Type mismatch; expected list<number> but got list<string>' )
2020-09-30 22:59:42 +02:00
enddef
2020-12-08 11:29:40 +01:00
def Test_cannot_use_let ( )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ['let a = 34' ], 'E1126:' , 1 )
2020-12-08 11:29:40 +01:00
enddef
2020-09-30 22:59:42 +02:00
def Test_unlet ( )
g :somevar = 'yes'
assert_true ( exists ( 'g:somevar' ) )
unlet g :somevar
assert_false ( exists ( 'g:somevar' ) )
unlet ! g :somevar
# also works for script - local variable in legacy Vim script
s :somevar = 'legacy'
assert_true ( exists ( 's:somevar' ) )
unlet s :somevar
assert_false ( exists ( 's:somevar' ) )
unlet ! s :somevar
2022-02-04 21:17:58 +00:00
if 0
unlet g :does_not_exist
endif
v9 .CheckDefExecFailure ( ['unlet v:notfound.key' ], 'E1001:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( [
2021-01-05 20:58:25 +01:00
'var dd = 111' ,
'unlet dd' ,
], 'E1081:' , 2 )
2021-01-04 21:57:11 +01:00
# dict unlet
2022-02-17 14:42:02 +00:00
var dd = {a : 1 , b : 2 , c : 3 , 4 : 4 }
2021-01-04 21:57:11 +01:00
unlet dd ['a' ]
unlet dd .c
2022-02-17 14:42:02 +00:00
unlet dd [4 ]
2021-01-04 21:57:11 +01:00
assert_equal ( {b : 2 }, dd )
# list unlet
var ll = [1 , 2 , 3 , 4 ]
unlet ll [1 ]
unlet ll [-1 ]
assert_equal ( [1 , 3 ], ll )
2021-02-20 17:04:02 +01:00
ll = [1 , 2 , 3 , 4 ]
unlet ll [0 : 1 ]
assert_equal ( [3 , 4 ], ll )
ll = [1 , 2 , 3 , 4 ]
unlet ll [2 : 8 ]
assert_equal ( [1 , 2 ], ll )
ll = [1 , 2 , 3 , 4 ]
unlet ll [-2 : -1 ]
assert_equal ( [1 , 2 ], ll )
2022-02-17 19:44:07 +00:00
g :nrdict = {1 : 1 , 2 : 2 }
g :idx = 1
unlet g :nrdict [g :idx ]
assert_equal ( {2 : 2 }, g :nrdict )
unlet g :nrdict
unlet g :idx
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2021-02-20 17:04:02 +01:00
'var ll = [1, 2]' ,
'll[1 : 2] = 7' ,
2021-08-11 21:49:23 +02:00
], 'E1012: Type mismatch; expected list<number> but got number' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2021-02-20 17:04:02 +01:00
'var dd = {a: 1}' ,
'unlet dd["a" : "a"]' ,
], 'E1166:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( [
2021-02-20 17:04:02 +01:00
'unlet g:adict[0 : 1]' ,
], 'E1148:' , 1 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2021-02-20 17:04:02 +01:00
'var ll = [1, 2]' ,
'unlet ll[0:1]' ,
], 'E1004:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2021-02-20 17:04:02 +01:00
'var ll = [1, 2]' ,
'unlet ll[0 :1]' ,
], 'E1004:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2021-02-20 17:04:02 +01:00
'var ll = [1, 2]' ,
'unlet ll[0: 1]' ,
], 'E1004:' , 2 )
2022-02-17 13:08:26 +00:00
v9 .CheckDefExecFailure ( [
'g:ll = [1, 2]' ,
'g:idx = "x"' ,
'unlet g:ll[g:idx]' ,
], 'E1029: Expected number but got string' , 3 )
v9 .CheckDefExecFailure ( [
'g:ll = [1, 2, 3]' ,
'g:idx = "x"' ,
'unlet g:ll[g:idx : 2]' ,
], 'E1029: Expected number but got string' , 3 )
v9 .CheckDefExecFailure ( [
'g:ll = [1, 2, 3]' ,
'g:idx = "x"' ,
'unlet g:ll[0 : g:idx]' ,
], 'E1029: Expected number but got string' , 3 )
2021-11-29 16:01:49 +00:00
# command recognized as assignment when skipping , should not give an error
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( [
2021-11-29 16:01:49 +00:00
'vim9script' ,
'for i in []' ,
" put =''",
'endfor' ])
2021-02-20 17:04:02 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2021-02-20 17:04:02 +01:00
'var ll = [1, 2]' ,
'unlet ll["x" : 1]' ,
], 'E1012:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( [
2021-02-20 17:04:02 +01:00
'var ll = [1, 2]' ,
'unlet ll[0 : "x"]' ,
], 'E1012:' , 2 )
2021-01-04 21:57:11 +01:00
# list of dict unlet
var dl = [{a : 1 , b : 2 }, {c : 3 }]
unlet dl [0 ]['b' ]
assert_equal ( [{a : 1 }, {c : 3 }], dl )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( [
2021-01-05 20:58:25 +01:00
'var ll = test_null_list()' ,
'unlet ll[0]' ,
], 'E684:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( [
2021-01-05 20:58:25 +01:00
'var ll = [1]' ,
'unlet ll[2]' ,
], 'E684:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( [
2021-01-05 20:58:25 +01:00
'var ll = [1]' ,
'unlet ll[g:astring]' ,
2021-01-17 21:51:24 +01:00
], 'E1012:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( [
2021-01-05 20:58:25 +01:00
'var dd = test_null_dict()' ,
'unlet dd["a"]' ,
], 'E716:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( [
2021-01-05 20:58:25 +01:00
'var dd = {a: 1}' ,
'unlet dd["b"]' ,
], 'E716:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( [
2021-01-05 20:58:25 +01:00
'var dd = {a: 1}' ,
'unlet dd[g:alist]' ,
], 'E1105:' , 2 )
2021-01-04 21:57:11 +01:00
2022-02-17 14:42:02 +00:00
v9 .CheckDefExecFailure ( [
'g:dd = {"a": 1, 2: 2}'
'unlet g:dd[0z11]' ,
], 'E1029:' , 2 )
2022-02-17 16:30:11 +00:00
v9 .CheckDefExecFailure ( [
'g:str = "a string"'
'unlet g:str[0]' ,
], 'E1148: Cannot index a string' , 2 )
2022-02-17 14:42:02 +00:00
2021-01-03 20:55:26 +01:00
# can compile unlet before variable exists
2021-01-04 21:57:11 +01:00
g :someDict = {key : 'val' }
var k = 'key'
unlet g :someDict [k ]
assert_equal ( {}, g :someDict )
unlet g :someDict
assert_false ( exists ( 'g:someDict' ) )
2021-01-03 20:55:26 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-09-30 22:59:42 +02:00
'vim9script' ,
'var svar = 123' ,
'unlet svar' ,
], 'E1081:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-09-30 22:59:42 +02:00
'vim9script' ,
'var svar = 123' ,
'unlet s:svar' ,
2022-02-12 19:52:25 +00:00
], 'E1268:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-09-30 22:59:42 +02:00
'vim9script' ,
'var svar = 123' ,
'def Func()' ,
' unlet svar' ,
'enddef' ,
'defcompile' ,
], 'E1081:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-12-18 15:38:00 +01:00
'vim9script' ,
'var svar = 123' ,
'func Func()' ,
' unlet s:svar' ,
'endfunc' ,
'Func()' ,
], 'E1081:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2020-09-30 22:59:42 +02:00
'vim9script' ,
'var svar = 123' ,
'def Func()' ,
' unlet s:svar' ,
'enddef' ,
'defcompile' ,
], 'E1081:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2021-12-17 20:15:38 +00:00
'vim9script' ,
'def Delcount(dict: dict<any>)' ,
' unlet dict.count' ,
'enddef' ,
'Delcount(v:)' ,
], 'E742:' )
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( [
2021-12-17 20:15:38 +00:00
'vim9script' ,
'def DelChangedtick(dict: dict<any>)' ,
' unlet dict.changedtick' ,
'enddef' ,
'DelChangedtick(b:)' ,
], 'E795:' )
2021-01-05 20:58:25 +01:00
writefile ( ['vim9script' , 'export var svar = 1234' ], 'XunletExport.vim' )
var lines = < < trim END
vim9script
2022-01-06 21:10:28 +00:00
import './XunletExport.vim' as exp
2021-01-05 20:58:25 +01:00
def UnletSvar ( )
2022-01-06 21:10:28 +00:00
unlet exp .svar
2021-01-05 20:58:25 +01:00
enddef
defcompile
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1260:' , 1 )
2021-01-05 20:58:25 +01:00
delete ( 'XunletExport.vim' )
2020-09-30 22:59:42 +02:00
$ENVVAR = 'foobar'
assert_equal ( 'foobar' , $ENVVAR )
unlet $ENVVAR
assert_equal ( '' , $ENVVAR )
enddef
2021-01-21 12:34:14 +01:00
def Test_expr_error_no_assign ( )
var lines = < < trim END
vim9script
var x = invalid
echo x
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailureList ( lines , ['E121:' , 'E121:' ])
2021-01-21 12:34:14 +01:00
lines = < < trim END
vim9script
var x = 1 / 0
echo x
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1154:' )
2021-01-21 12:34:14 +01:00
lines = < < trim END
vim9script
var x = 1 % 0
echo x
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1154:' )
2021-03-26 21:27:52 +01:00
lines = < < trim END
var x : string 'string'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E488:' )
2021-01-21 12:34:14 +01:00
enddef
2021-01-07 22:03:02 +01:00
def Test_assign_command_modifier ( )
var lines = < < trim END
2021-01-09 12:09:22 +01:00
var verbose = 0
verbose = 1
assert_equal ( 1 , verbose )
silent verbose = 2
assert_equal ( 2 , verbose )
silent verbose + = 2
assert_equal ( 4 , verbose )
silent verbose - = 1
assert_equal ( 3 , verbose )
var topleft = {one : 1 }
sandbox topleft .one = 3
assert_equal ( {one : 3 }, topleft )
leftabove topleft [' ' ] = 4
assert_equal ( {one : 3 , ' ' : 4 }, topleft )
var x : number
var y : number
silent [x , y ] = [1 , 2 ]
assert_equal ( 1 , x )
assert_equal ( 2 , y )
2021-01-07 22:03:02 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-01-07 22:03:02 +01:00
enddef
2021-06-17 21:03:07 +02:00
def Test_assign_alt_buf_register ( )
var lines = < < trim END
edit 'file_b1'
var b1 = bufnr ( )
edit 'file_b2'
var b2 = bufnr ( )
assert_equal ( b1 , bufnr ( '#' ) )
@# = b2
assert_equal ( b2 , bufnr ( '#' ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-06-17 21:03:07 +02:00
enddef
2021-01-07 22:03:02 +01:00
2021-03-28 21:14:06 +02:00
def Test_script_funcref_case ( )
var lines = < < trim END
var Len = ( s : string ) : number = > len ( s ) + 1
assert_equal ( 5 , Len ( 'asdf' ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-03-28 21:14:06 +02:00
lines = < < trim END
var len = ( s : string ) : number = > len ( s ) + 1
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E704:' )
2021-03-28 21:14:06 +02:00
lines = < < trim END
vim9script
2022-02-12 19:52:25 +00:00
var Len = ( s : string ) : number = > len ( s ) + 2
2021-03-28 21:14:06 +02:00
assert_equal ( 6 , Len ( 'asdf' ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-03-28 21:14:06 +02:00
lines = < < trim END
vim9script
2022-02-12 19:52:25 +00:00
var len = ( s : string ) : number = > len ( s ) + 1
2021-03-28 21:14:06 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E704:' )
2021-03-28 21:14:06 +02:00
enddef
2021-12-18 12:31:33 +00:00
def Test_script_funcref_runtime_type_check ( )
var lines = < < trim END
vim9script
def FuncWithNumberArg ( n : number )
enddef
def Test ( )
var Ref : func ( string ) = function ( FuncWithNumberArg )
enddef
defcompile
END
# OK at compile time
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-12-18 12:31:33 +00:00
# Type check fails at runtime
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines + ['Test()' ], 'E1012: Type mismatch; expected func(string) but got func(number)' )
2021-12-18 12:31:33 +00:00
enddef
2021-04-24 19:08:24 +02:00
def Test_inc_dec ( )
var lines = < < trim END
var nr = 7
+ + nr
2021-04-24 20:43:56 +02:00
assert_equal ( 8 , nr )
2021-04-24 19:08:24 +02:00
- - nr
2021-04-24 20:43:56 +02:00
assert_equal ( 7 , nr )
2021-06-25 19:29:30 +02:00
+ + nr | + + nr
assert_equal ( 9 , nr )
+ + nr # comment
assert_equal ( 10 , nr )
2021-04-24 19:08:24 +02:00
var ll = [1 , 2 ]
- - ll [0 ]
+ + ll [1 ]
2021-04-24 20:43:56 +02:00
assert_equal ( [0 , 3 ], ll )
g :count = 1
+ + g :count
- - g :count
assert_equal ( 1 , g :count )
unlet g :count
2021-04-24 19:08:24 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-06-25 21:31:09 +02:00
lines = < < trim END
var nr = 7
+ + nr
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , "E1202: No white space allowed after '++': ++ nr" )
2021-04-24 19:08:24 +02:00
enddef
2021-07-28 19:34:14 +02:00
def Test_abort_after_error ( )
# should abort after strpart ( ) fails , not give another type error
var lines = < < trim END
vim9script
var x : string
x = strpart ( 1 , 2 )
END
writefile ( lines , 'Xtestscript' )
var expected = 'E1174: String required for argument 1'
assert_fails ( 'so Xtestscript' , [expected , expected ], 3 )
delete ( 'Xtestscript' )
enddef
2022-02-22 20:43:36 +00:00
def Test_using_s_var_in_function ( )
var lines = < < trim END
vim9script
var scriptlevel = 123
def SomeFunc ( )
echo s :scriptlevel
enddef
SomeFunc ( )
END
v9 .CheckScriptFailure ( lines , 'E1268:' )
# OK in legacy script
lines = < < trim END
let s :scriptlevel = 123
def s :SomeFunc ( )
echo s :scriptlevel
enddef
call s :SomeFunc ( )
END
v9 .CheckScriptSuccess ( lines )
lines = < < trim END
vim9script
var scriptlevel = 123
def SomeFunc ( )
s :scriptlevel = 456
enddef
SomeFunc ( )
END
v9 .CheckScriptFailure ( lines , 'E1268:' )
# OK in legacy script
lines = < < trim END
let s :scriptlevel = 123
def s :SomeFunc ( )
s :scriptlevel = 456
enddef
call s :SomeFunc ( )
call assert_equal ( 456 , s :scriptlevel )
END
v9 .CheckScriptSuccess ( lines )
enddef
2021-07-28 19:34:14 +02:00
2020-09-30 22:59:42 +02:00
2020-09-21 22:21:42 +02:00
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker