2020-01-26 15:56:19 +01:00
" Tests for Vim9 script expressions
source check .vim
2022-01-29 21:45:34 +00:00
import './vim9.vim' as v9
2020-01-26 15:56:19 +01:00
2020-07-21 20:55:50 +02:00
let g :cond = v :false
def FuncOne ( arg : number ) : string
return 'yes'
enddef
def FuncTwo ( arg : number ) : number
return 123
enddef
2020-01-26 15:56:19 +01:00
" test cond ? expr : expr
2022-02-26 11:46:13 +00:00
def Test_expr1_ternary ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( 'one' , true ? 'one' : 'two' )
assert_equal ( 'one' , 1 ?
'one' :
'two' )
if has ( 'float' )
assert_equal ( 'one' , ! ! 0 .1 ? 'one' : 'two' )
endif
assert_equal ( 'one' , ! ! 'x' ? 'one' : 'two' )
assert_equal ( 'one' , ! ! 'x'
? 'one'
: 'two' )
assert_equal ( 'one' , ! ! 0 z1234 ? 'one' : 'two' )
assert_equal ( 'one' , ! ! [0 ] ? 'one' : 'two' )
2020-12-02 17:36:54 +01:00
assert_equal ( 'one' , ! ! {x : 0 } ? 'one' : 'two' )
2020-11-12 20:16:39 +01:00
var name = 1
assert_equal ( 'one' , name ? 'one' : 'two' )
assert_equal ( 'two' , false ? 'one' : 'two' )
assert_equal ( 'two' , 0 ? 'one' : 'two' )
if has ( 'float' )
assert_equal ( 'two' , ! ! 0 .0 ? 'one' : 'two' )
endif
assert_equal ( 'two' , ! ! '' ? 'one' : 'two' )
assert_equal ( 'two' , ! ! 0 z ? 'one' : 'two' )
assert_equal ( 'two' , ! ! [] ? 'one' : 'two' )
assert_equal ( 'two' , ! ! {} ? 'one' : 'two' )
name = 0
assert_equal ( 'two' , name ? 'one' : 'two' )
2021-01-03 18:33:13 +01:00
echo ['a' ] + ( 1 ? ['b' ] : ['c' ]
)
echo ['a' ] + ( 1 ? ['b' ] : ['c' ] # comment
)
2020-11-12 20:16:39 +01:00
# with constant condition expression is not evaluated
assert_equal ( 'one' , 1 ? 'one' : xxx )
var Some : func = function ( 'len' )
var Other : func = function ( 'winnr' )
var Res : func = g :atrue ? Some : Other
assert_equal ( function ( 'len' ) , Res )
var RetOne : func ( string ) : number = function ( 'len' )
2021-07-04 15:54:08 +02:00
var RetTwo : func ( string ) : number = function ( 'charcol' )
2020-11-12 20:16:39 +01:00
var RetThat : func = g :atrue ? RetOne : RetTwo
assert_equal ( function ( 'len' ) , RetThat )
2022-01-30 15:28:30 +00:00
var X = g :FuncOne
var Y = g :FuncTwo
var Z = g :cond ? g :FuncOne : g :FuncTwo
2020-11-12 20:16:39 +01:00
assert_equal ( 123 , Z ( 3 ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2022-01-30 15:28:30 +00:00
lines = < < trim END
var Z = g :cond ? FuncOne : FuncTwo
END
v9 .CheckDefAndScriptFailure ( lines , ['E1001: Variable not found: FuncOne' , 'E121: Undefined variable: FuncTwo' ])
2020-01-26 15:56:19 +01:00
enddef
2022-02-26 11:46:13 +00:00
def Test_expr1_ternary_vimscript ( )
2020-08-05 12:44:41 +02:00
# check line continuation
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 1
2020-06-26 21:28:25 +02:00
? 'yes'
: 'no'
2020-09-27 21:58:45 +02:00
assert_equal ( 'yes' , name )
2020-06-26 21:28:25 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 21:28:25 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :false
2020-06-26 21:28:25 +02:00
? 'yes'
: 'no'
2020-09-27 21:58:45 +02:00
assert_equal ( 'no' , name )
2020-06-26 21:28:25 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 21:18:00 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :false ?
2020-06-27 21:18:00 +02:00
'yes' :
'no'
2020-09-27 21:58:45 +02:00
assert_equal ( 'no' , name )
2020-06-27 21:18:00 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-05 12:44:41 +02:00
2020-10-11 21:34:41 +02:00
lines = < < trim END
var name = v :false ? # comment
'yes' :
# comment
'no' # comment
assert_equal ( 'no' , name )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-11 21:34:41 +02:00
2020-08-05 12:44:41 +02:00
# check white space
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true ?1 :2
2020-08-05 12:44:41 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''?'' at "?1:2"' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 12:44:41 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true ? 1 : 2
2020-08-05 12:44:41 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 12:44:41 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true ?1 : 2
2020-08-05 12:44:41 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 12:44:41 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true ? 1 : 2
2020-08-05 12:44:41 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after '':'' at ": 2"' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 12:44:41 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true ? 1 :2
2020-08-05 12:44:41 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2020-08-22 22:37:20 +02:00
2020-10-04 16:06:05 +02:00
lines = < < trim END
var name = 'x' ? 1 : 2
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1135:' , 1 )
2020-10-04 16:06:05 +02:00
lines = < < trim END
var name = [] ? 1 : 2
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E745:' , 1 )
2020-10-04 16:06:05 +02:00
lines = < < trim END
var name = {} ? 1 : 2
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E728:' , 1 )
2020-10-04 16:06:05 +02:00
2020-08-22 22:37:20 +02:00
# check after failure eval_flags is reset
lines = < < trim END
try
2020-09-06 15:58:36 +02:00
eval ( '0 ? 1: 2' )
2020-08-22 22:37:20 +02:00
catch
endtry
assert_equal ( v :true , eval ( string ( v :true ) ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-22 22:37:20 +02:00
lines = < < trim END
try
2020-09-06 15:58:36 +02:00
eval ( '0 ? 1 :2' )
2020-08-22 22:37:20 +02:00
catch
endtry
assert_equal ( v :true , eval ( string ( v :true ) ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 21:28:25 +02:00
enddef
2022-02-26 11:46:13 +00:00
func Test_expr1_ternary_fails ( )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1 ? 'one'" ], "Missing ':' after '?'" , 1 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '?'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1? 'one' : 'two'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 ?'one' : 'two'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1?'one' : 'two'" ], msg , 1 )
2021-05-28 17:52:40 +02:00
let lines = < < trim END
var x = 1
?'one' : 'two'
# comment
END
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''?'' at "?''one'' : ''two''"' , 2 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after ':'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1 ? 'one': 'two'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 ? 'one' :'two'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 ? 'one':'two'" ], msg , 1 )
2021-05-28 17:52:40 +02:00
let lines = < < trim END
var x = 1 ? 'one'
:'two'
# Comment
END
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after '':'' at ":''two''"' , 2 )
2020-07-21 20:55:50 +02:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 'x' ? 'one' : 'two'" ], 'E1135:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0z1234 ? 'one' : 'two'" ], 'E974:' , 1 )
call v9 .CheckDefExecAndScriptFailure ( ["var x = [] ? 'one' : 'two'" ], 'E745:' , 1 )
call v9 .CheckDefExecAndScriptFailure ( ["var x = {} ? 'one' : 'two'" ], 'E728:' , 1 )
2020-10-04 16:06:05 +02:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefExecFailure ( ["var x = false ? " ], 'E1097:' , 3 )
call v9 .CheckScriptFailure ( ['vim9script' , "var x = false ? " ], 'E15:' , 2 )
call v9 .CheckDefExecFailure ( ["var x = false ? 'one' : " ], 'E1097:' , 3 )
call v9 .CheckScriptFailure ( ['vim9script' , "var x = false ? 'one' : " ], 'E15:' , 2 )
2020-12-06 14:37:08 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefExecAndScriptFailure ( ["var x = true ? xxx : 'foo'" ], ['E1001:' , 'E121:' ], 1 )
call v9 .CheckDefExecAndScriptFailure ( ["var x = false ? 'foo' : xxx" ], ['E1001:' , 'E121:' ], 1 )
2020-12-06 14:37:08 +01:00
2020-10-04 16:06:05 +02:00
if has ( 'float' )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 0.1 ? 'one' : 'two'" ], 'E805:' , 1 )
2020-10-04 16:06:05 +02:00
endif
2020-07-21 20:55:50 +02:00
" missing argument detected even when common type is used
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( [
2022-01-30 15:28:30 +00:00
\ 'var X = g:FuncOne' ,
\ 'var Y = g:FuncTwo' ,
\ 'var Z = g:cond ? g:FuncOne : g:FuncTwo' ,
2020-08-18 20:34:13 +02:00
\ 'Z()' ], 'E119:' , 4 )
2020-01-26 15:56:19 +01:00
endfunc
2020-10-03 20:17:30 +02:00
def Test_expr1_falsy ( )
var lines = < < trim END
assert_equal ( v :true , v :true ?? 456 )
assert_equal ( 123 , 123 ?? 456 )
assert_equal ( 'yes' , 'yes' ?? 456 )
assert_equal ( [1 ], [1 ] ?? 456 )
2020-12-02 17:36:54 +01:00
assert_equal ( {one : 1 }, {one : 1 } ?? 456 )
2020-10-03 20:17:30 +02:00
if has ( 'float' )
assert_equal ( 0 .1 , 0 .1 ?? 456 )
endif
assert_equal ( 456 , v :false ?? 456 )
assert_equal ( 456 , 0 ?? 456 )
assert_equal ( 456 , '' ?? 456 )
assert_equal ( 456 , [] ?? 456 )
assert_equal ( 456 , {} ?? 456 )
if has ( 'float' )
assert_equal ( 456 , 0 .0 ?? 456 )
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-03 20:17:30 +02:00
var msg = "White space required before and after '??'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1?? 'one' : 'two'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 ??'one' : 'two'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1??'one' : 'two'" ], msg , 1 )
2021-05-28 17:52:40 +02:00
lines = < < trim END
var x = 1
??'one' : 'two'
#comment
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''??'' at "??''one'' : ''two''"' , 2 )
2020-10-03 20:17:30 +02:00
enddef
2022-01-29 21:45:34 +00:00
def g :Record ( val : any ) : any
2020-01-26 15:56:19 +01:00
g :vals - > add ( val )
return val
enddef
" test ||
def Test_expr2 ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( true , 1 | | 0 )
assert_equal ( true , 0 | |
0 | |
1 )
assert_equal ( true , 0 | |
0 | |
! ! 7 )
assert_equal ( false , 0 | | 0 )
assert_equal ( false , 0
| | 0 )
assert_equal ( false , 0 | | false )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( true , g :Record ( 1 ) | | g :Record ( 3 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [1 ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( true , g :Record ( 0 ) | | g :Record ( 1 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [0 , 1 ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( true , g :Record ( 0 ) | | g :Record ( true ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [0 , true ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( true , g :Record ( 0 )
| | g :Record ( 1 )
| | g :Record ( 0 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [0 , 1 ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( true , g :Record ( 0 )
| | g :Record ( true )
| | g :Record ( 0 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [0 , true ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( true , g :Record ( true ) | | g :Record ( false ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [true ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :Record ( 0 ) | | g :Record ( false ) | | g :Record ( 0 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [0 , false , 0 ], g :vals )
2021-04-11 18:24:46 +02:00
g :vals = []
var x = 1
if x | | true
g :vals = [1 ]
endif
assert_equal ( [1 ], g :vals )
g :vals = []
x = 3
if true | | x
g :vals = [1 ]
endif
assert_equal ( [1 ], g :vals )
2020-11-12 20:16:39 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2020-06-26 21:38:51 +02:00
def Test_expr2_vimscript ( )
2020-07-17 20:36:00 +02:00
# check line continuation
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 0
2020-06-26 21:38:51 +02:00
| | 1
2020-10-03 22:52:39 +02:00
assert_equal ( true , name )
2020-06-26 21:38:51 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 21:38:51 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :false
2020-06-26 21:38:51 +02:00
| | v :true
| | v :false
2020-09-27 21:58:45 +02:00
assert_equal ( v :true , name )
2020-06-26 21:38:51 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 21:18:00 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :false | |
2020-06-27 21:18:00 +02:00
v :true | |
v :false
2020-09-27 21:58:45 +02:00
assert_equal ( v :true , name )
2020-07-13 22:29:02 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-13 22:29:02 +02:00
2020-10-11 21:34:41 +02:00
lines = < < trim END
var name = v :false | | # comment
# comment
v :true | |
# comment
v :false # comment
assert_equal ( v :true , name )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-11 21:34:41 +02:00
2020-08-05 12:32:38 +02:00
# check white space
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true | | v :true
2020-08-05 12:32:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1004: White space required before and after ''||'' at "||v:true"' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 12:32:38 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true | | v :true
2020-08-05 12:32:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 12:32:38 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true | | v :true
2020-08-05 12:32:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2020-06-26 21:38:51 +02:00
enddef
2020-10-03 22:52:39 +02:00
def Test_expr2_fails ( )
var msg = "White space required before and after '||'"
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = 1||0" ], msg , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = 1 ||0" ], msg , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = 1|| 0" ], msg , 1 )
2020-04-01 21:17:24 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ["var x = false || " ], 'E1097:' , 3 )
v9 .CheckScriptFailure ( ['vim9script' , "var x = false || " ], 'E15:' , 2 )
2020-12-06 14:37:08 +01:00
2021-04-04 20:49:50 +02:00
# script does not fail , the second expression is skipped
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ["var x = 1 || xxx" ], 'E1001:' , 1 )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = [] || false" ], ['E1012:' , 'E745:' ], 1 )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["if 'yes' || 0" , 'echo 0' , 'endif' ], ['E1012: Type mismatch; expected bool but got string' , 'E1135: Using a String as a Bool' ], 1 )
2020-10-03 22:52:39 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = 3 || false" ], ['E1012:' , 'E1023:' ], 1 )
v9 .CheckDefAndScriptFailure ( ["var x = false || 3" ], ['E1012:' , 'E1023:' ], 1 )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["if 3" ], 'E1023:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['var x = 3' , 'if x' , 'endif' ], 'E1023:' , 2 )
2021-04-11 18:24:46 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = [] || false" ], ['E1012: Type mismatch; expected bool but got list<unknown>' , 'E745:' ], 1 )
2021-04-04 20:49:50 +02:00
2021-05-28 17:52:40 +02:00
var lines = < < trim END
vim9script
echo false
| | true
# comment
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1004: White space required before and after ''||'' at "||true"' , 3 )
2021-07-15 15:40:58 +02:00
lines = < < trim END
var x = false
| | false
| | a .b
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1001:' , 3 )
2020-10-03 22:52:39 +02:00
enddef
2020-01-26 15:56:19 +01:00
" test &&
def Test_expr3 ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( false , 1 && 0 )
assert_equal ( false , 0 &&
0 &&
1 )
assert_equal ( true , 1
&& true
&& 1 )
assert_equal ( false , 0 && 0 )
assert_equal ( false , 0 && false )
assert_equal ( true , 1 && true )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( true , g :Record ( true ) && g :Record ( 1 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [true , 1 ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( true , g :Record ( 1 ) && g :Record ( true ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [1 , true ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :Record ( 0 ) && g :Record ( 1 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [0 ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :Record ( 0 ) && g :Record ( 1 ) && g :Record ( 0 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [0 ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :Record ( 0 ) && g :Record ( 4 ) && g :Record ( 0 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [0 ], g :vals )
g :vals = []
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :Record ( 1 ) && g :Record ( true ) && g :Record ( 0 ) )
2020-11-12 20:16:39 +01:00
assert_equal ( [1 , true , 0 ], g :vals )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2020-06-26 21:38:51 +02:00
def Test_expr3_vimscript ( )
2020-07-17 20:36:00 +02:00
# check line continuation
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 0
2020-06-26 21:38:51 +02:00
&& 1
2020-10-03 22:52:39 +02:00
assert_equal ( false , name )
2020-06-26 21:38:51 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 21:38:51 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true
2020-06-26 21:38:51 +02:00
&& v :true
&& v :true
2020-09-27 21:58:45 +02:00
assert_equal ( v :true , name )
2020-06-26 21:38:51 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 21:18:00 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true &&
2020-06-27 21:18:00 +02:00
v :true &&
v :true
2020-09-27 21:58:45 +02:00
assert_equal ( v :true , name )
2020-07-13 22:29:02 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-13 22:29:02 +02:00
2020-10-11 21:34:41 +02:00
lines = < < trim END
var name = v :true && # comment
# comment
v :true &&
# comment
v :true
assert_equal ( v :true , name )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-11 21:34:41 +02:00
2020-08-05 12:32:38 +02:00
# check white space
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true &&v :true
2020-08-05 12:32:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 12:32:38 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true &&v :true
2020-08-05 12:32:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''&&'' at "&&v:true"' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 12:32:38 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = v :true && v :true
2020-08-05 12:32:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2020-06-26 21:38:51 +02:00
enddef
2021-04-03 21:47:07 +02:00
def Test_expr3_fails ( )
var msg = "White space required before and after '&&'"
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = 1&&0" ], msg , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = 1 &&0" ], msg , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = 1&& 0" ], msg , 1 )
2021-05-28 17:52:40 +02:00
var lines = < < trim END
var x = 1
2021-07-21 21:37:28 +02:00
&&0
2021-05-28 17:52:40 +02:00
# comment
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''&&'' at "&&0"' , 2 )
2020-11-12 12:08:51 +01:00
2021-04-04 20:49:50 +02:00
g :vals = []
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["if 'yes' && 0" , 'echo 0' , 'endif' ], ['E1012: Type mismatch; expected bool but got string' , 'E1135: Using a String as a Bool' ], 1 )
2020-11-12 20:16:39 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ['assert_equal(false, g:Record(1) && g:Record(4) && g:Record(0))' ], 'E1023: Using a Number as a Bool: 4' , 1 )
2021-04-03 21:47:07 +02:00
2021-05-28 17:52:40 +02:00
lines = < < trim END
2021-04-03 21:47:07 +02:00
if 3
&& true
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1012:' , 'E1023:' ], 1 )
2021-07-21 21:37:28 +02:00
lines = < < trim END
if true
&& 3
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1012:' , 'E1023:' ], 2 )
2021-04-03 21:47:07 +02:00
lines = < < trim END
if 'yes'
&& true
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1012:' , 'E1135: Using a String as a Bool' ], 1 )
2021-04-03 21:47:07 +02:00
enddef
2020-01-26 15:56:19 +01:00
2020-08-16 14:48:19 +02:00
" global variables to use for tests with the "any" type
2020-01-26 15:56:19 +01:00
let atrue = v :true
let afalse = v :false
let anone = v :none
let anull = v :null
let anint = 10
2020-08-16 14:48:19 +02:00
let theone = 1
let thefour = 4
2020-01-26 15:56:19 +01:00
if has ( 'float' )
let afloat = 0 .1
endif
let astring = 'asdf'
let ablob = 0 z01 ab
let alist = [2 , 3 , 4 ]
let adict = #{aaa : 2 , bbb : 8 }
" test == comperator
def Test_expr4_equal ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
var trueVar = true
var falseVar = false
assert_equal ( true , true = = true )
assert_equal ( false , true = =
false )
assert_equal ( true , true
= = trueVar )
assert_equal ( false , true = = falseVar )
assert_equal ( true , true = = g :atrue )
assert_equal ( false , g :atrue = = false )
assert_equal ( true , v :none = = v :none )
assert_equal ( false , v :none = = v :null )
assert_equal ( true , g :anone = = v :none )
2021-01-03 21:53:53 +01:00
assert_equal ( true , null = = v :null )
assert_equal ( true , null = = g :anull )
2020-11-12 20:16:39 +01:00
assert_equal ( false , v :none = = g :anull )
var nr0 = 0
var nr61 = 61
assert_equal ( false , 2 = = 0 )
assert_equal ( false , 2 = = nr0 )
assert_equal ( true , 61 = = 61 )
assert_equal ( true , 61 = = nr61 )
assert_equal ( true , g :anint = = 10 )
assert_equal ( false , 61 = = g :anint )
2020-01-26 15:56:19 +01:00
2020-11-12 20:16:39 +01:00
if has ( 'float' )
var ff = 0 .3
assert_equal ( true , ff = = 0 .3 )
assert_equal ( false , 0 .4 = = ff )
assert_equal ( true , 0 .1 = = g :afloat )
assert_equal ( false , g :afloat = = 0 .3 )
ff = 3 .0
assert_equal ( true , ff = = 3 )
assert_equal ( true , 3 = = ff )
ff = 3 .1
assert_equal ( false , ff = = 3 )
assert_equal ( false , 3 = = ff )
endif
2020-03-30 22:51:24 +02:00
2020-11-12 20:16:39 +01:00
assert_equal ( true , 'abc' = = 'abc' )
assert_equal ( false , 'xyz' = = 'abc' )
assert_equal ( true , g :astring = = 'asdf' )
assert_equal ( false , 'xyz' = = g :astring )
assert_equal ( false , 'abc' = = 'aBc' )
assert_equal ( false , 'abc' = = # 'aBc' )
assert_equal ( true , 'abc' = = ? 'aBc' )
assert_equal ( false , 'abc' = = 'ABC' )
set ignorecase
assert_equal ( false , 'abc' = = 'ABC' )
assert_equal ( false , 'abc' = = # 'ABC' )
assert_equal ( true , 'abc' = = ? 'ABC' )
set noignorecase
var bb = 0 z3 f
assert_equal ( true , 0 z3 f = = bb )
assert_equal ( false , bb = = 0 z4 f)
assert_equal ( true , g :ablob = = 0 z01 ab)
assert_equal ( false , 0 z3 f = = g :ablob )
assert_equal ( true , [1 , 2 , 3 ] = = [1 , 2 , 3 ])
assert_equal ( false , [1 , 2 , 3 ] = = [2 , 3 , 1 ])
assert_equal ( true , [2 , 3 , 4 ] = = g :alist )
assert_equal ( false , g :alist = = [2 , 3 , 1 ])
assert_equal ( false , [1 , 2 , 3 ] = = [])
assert_equal ( false , [1 , 2 , 3 ] = = ['1' , '2' , '3' ])
2020-12-02 17:36:54 +01:00
assert_equal ( true , {one : 1 , two : 2 } = = {one : 1 , two : 2 })
assert_equal ( false , {one : 1 , two : 2 } = = {one : 2 , two : 2 })
assert_equal ( false , {one : 1 , two : 2 } = = {two : 2 })
assert_equal ( false , {one : 1 , two : 2 } = = {})
assert_equal ( true , g :adict = = {bbb : 8 , aaa : 2 })
assert_equal ( false , {ccc : 9 , aaa : 2 } = = g :adict )
2020-11-12 20:16:39 +01:00
assert_equal ( true , function ( 'g:Test_expr4_equal' ) = = function ( 'g:Test_expr4_equal' ) )
assert_equal ( false , function ( 'g:Test_expr4_equal' ) = = function ( 'g:Test_expr4_is' ) )
assert_equal ( true , function ( 'g:Test_expr4_equal' , [123 ]) = = function ( 'g:Test_expr4_equal' , [123 ]) )
assert_equal ( false , function ( 'g:Test_expr4_equal' , [123 ]) = = function ( 'g:Test_expr4_is' , [123 ]) )
assert_equal ( false , function ( 'g:Test_expr4_equal' , [123 ]) = = function ( 'g:Test_expr4_equal' , [999 ]) )
2021-12-14 18:57:45 +00:00
if true
var OneFunc : func
var TwoFunc : func
OneFunc = function ( 'len' )
TwoFunc = function ( 'len' )
assert_equal ( true , OneFunc ( 'abc' ) = = TwoFunc ( '123' ) )
endif
# check this doesn 't fail when skipped
if false
2020-11-14 20:57:20 +01:00
var OneFunc : func
var TwoFunc : func
OneFunc = function ( 'len' )
TwoFunc = function ( 'len' )
assert_equal ( true , OneFunc ( 'abc' ) = = TwoFunc ( '123' ) )
endif
2020-11-12 20:16:39 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = 'a' == xxx" ], ['E1001:' , 'E121:' ], 1 )
v9 .CheckDefFailure ( ["var x = 'a' == " ], 'E1097:' , 3 )
v9 .CheckScriptFailure ( ['vim9script' , "var x = 'a' == " ], 'E15:' , 2 )
2020-12-06 14:37:08 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ['var items: any' , 'eval 1 + 1' , 'eval 2 + 2' , 'if items == []' , 'endif' ], ['E691:' , 'E1072:' ], 4 )
2021-01-09 16:21:37 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ['var x: any = "a"' , 'echo x == true' ], 'E1072: Cannot compare string with bool' , 2 )
v9 .CheckDefExecAndScriptFailure ( ["var x: any = true" , 'echo x == ""' ], 'E1072: Cannot compare bool with string' , 2 )
v9 .CheckDefExecAndScriptFailure ( ["var x: any = 99" , 'echo x == true' ], ['E1138' , 'E1072:' ], 2 )
v9 .CheckDefExecAndScriptFailure ( ["var x: any = 'a'" , 'echo x == 99' ], ['E1030:' , 'E1072:' ], 2 )
2021-12-22 21:40:33 +00:00
lines = < < trim END
vim9script
var n : any = 2
def Compare ( )
eval n = = '3'
g :notReached = false
enddef
g :notReached = true
Compare ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1030: Using a String as a Number: "3"' )
2021-12-22 21:40:33 +00:00
assert_true ( g :notReached )
if has ( 'float' )
lines = < < trim END
vim9script
var n : any = 2 .2
def Compare ( )
eval n = = '3'
g :notReached = false
enddef
g :notReached = true
Compare ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E892: Using a String as a Float' )
2021-12-22 21:40:33 +00:00
assert_true ( g :notReached )
endif
unlet g :notReached
2021-07-18 14:43:43 +02:00
enddef
2021-01-09 16:21:37 +01:00
2021-07-18 14:43:43 +02:00
def Test_expr4_wrong_type ( )
2021-01-09 16:21:37 +01:00
for op in ['>' , '>=' , '<' , '<=' , '=~' , '!~' ]
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( [
2021-01-09 16:21:37 +01:00
"var a: any = 'a'",
'var b: any = true' ,
'echo a ' .. op .. ' b' ], 'E1072:' , 3 )
endfor
2021-07-18 14:43:43 +02:00
for op in ['>' , '>=' , '<' , '<=' ]
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( [
2021-07-18 14:43:43 +02:00
"var n: any = 2",
2021-12-19 18:33:23 +00:00
'echo n ' .. op .. ' "3"' ], ['E1030:' , 'E1072:' ], 2 )
2021-07-18 14:43:43 +02:00
endfor
for op in ['=~' , '!~' ]
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( [
2021-07-18 14:43:43 +02:00
"var n: any = 2",
'echo n ' .. op .. ' "3"' ], 'E1072:' , 2 )
endfor
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( [
2021-07-18 14:43:43 +02:00
'echo v:none == true' ], 'E1072:' , 1 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( [
2021-07-18 14:43:43 +02:00
'echo false >= true' ], 'E1072:' , 1 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( [
2021-07-18 14:43:43 +02:00
"var n: any = v:none",
'echo n == true' ], 'E1072:' , 2 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( [
2021-07-18 14:43:43 +02:00
"var n: any = v:none",
'echo n < true' ], 'E1072:' , 2 )
2020-01-26 15:56:19 +01:00
enddef
" test != comperator
def Test_expr4_notequal ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
var trueVar = true
var falseVar = false
assert_equal ( false , true ! = true )
assert_equal ( true , true ! =
false )
assert_equal ( false , true
! = trueVar )
assert_equal ( true , true ! = falseVar )
assert_equal ( false , true ! = g :atrue )
assert_equal ( true , g :atrue ! = false )
assert_equal ( false , v :none ! = v :none )
assert_equal ( true , v :none ! = v :null )
assert_equal ( false , g :anone ! = v :none )
assert_equal ( true , v :none ! = g :anull )
var nr55 = 55
var nr0 = 55
assert_equal ( true , 2 ! = 0 )
assert_equal ( true , 2 ! = nr0 )
assert_equal ( false , 55 ! = 55 )
assert_equal ( false , 55 ! = nr55 )
assert_equal ( false , g :anint ! = 10 )
assert_equal ( true , 61 ! = g :anint )
2020-01-26 15:56:19 +01:00
2020-11-12 20:16:39 +01:00
if has ( 'float' )
var ff = 0 .3
assert_equal ( false , 0 .3 ! = ff )
assert_equal ( true , 0 .4 ! = ff )
assert_equal ( false , 0 .1 ! = g :afloat )
assert_equal ( true , g :afloat ! = 0 .3 )
ff = 3 .0
assert_equal ( false , ff ! = 3 )
assert_equal ( false , 3 ! = ff )
ff = 3 .1
assert_equal ( true , ff ! = 3 )
assert_equal ( true , 3 ! = ff )
endif
2020-01-26 15:56:19 +01:00
2020-11-12 20:16:39 +01:00
assert_equal ( false , 'abc' ! = 'abc' )
assert_equal ( true , 'xyz' ! = 'abc' )
assert_equal ( false , g :astring ! = 'asdf' )
assert_equal ( true , 'xyz' ! = g :astring )
assert_equal ( true , 'abc' ! = 'ABC' )
set ignorecase
assert_equal ( true , 'abc' ! = 'ABC' )
assert_equal ( true , 'abc' ! = # 'ABC' )
assert_equal ( false , 'abc' ! = ? 'ABC' )
set noignorecase
var bb = 0 z3 f
assert_equal ( false , 0 z3 f ! = bb )
assert_equal ( true , bb ! = 0 z4 f)
assert_equal ( false , g :ablob ! = 0 z01 ab)
assert_equal ( true , 0 z3 f ! = g :ablob )
assert_equal ( false , [1 , 2 , 3 ] ! = [1 , 2 , 3 ])
assert_equal ( true , [1 , 2 , 3 ] ! = [2 , 3 , 1 ])
assert_equal ( false , [2 , 3 , 4 ] ! = g :alist )
assert_equal ( true , g :alist ! = [2 , 3 , 1 ])
assert_equal ( true , [1 , 2 , 3 ] ! = [])
assert_equal ( true , [1 , 2 , 3 ] ! = ['1' , '2' , '3' ])
2020-12-02 17:36:54 +01:00
assert_equal ( false , {one : 1 , two : 2 } ! = {one : 1 , two : 2 })
assert_equal ( true , {one : 1 , two : 2 } ! = {one : 2 , two : 2 })
assert_equal ( true , {one : 1 , two : 2 } ! = {two : 2 })
assert_equal ( true , {one : 1 , two : 2 } ! = {})
assert_equal ( false , g :adict ! = {bbb : 8 , aaa : 2 })
assert_equal ( true , {ccc : 9 , aaa : 2 } ! = g :adict )
2020-11-12 20:16:39 +01:00
assert_equal ( false , function ( 'g:Test_expr4_equal' ) ! = function ( 'g:Test_expr4_equal' ) )
assert_equal ( true , function ( 'g:Test_expr4_equal' ) ! = function ( 'g:Test_expr4_is' ) )
assert_equal ( false , function ( 'g:Test_expr4_equal' , [123 ]) ! = function ( 'g:Test_expr4_equal' , [123 ]) )
assert_equal ( true , function ( 'g:Test_expr4_equal' , [123 ]) ! = function ( 'g:Test_expr4_is' , [123 ]) )
assert_equal ( true , function ( 'g:Test_expr4_equal' , [123 ]) ! = function ( 'g:Test_expr4_equal' , [999 ]) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
" test > comperator
def Test_expr4_greater ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_true ( 2 > 0 )
assert_true ( 2 >
1 )
assert_false ( 2 > 2 )
assert_false ( 2 > 3 )
var nr2 = 2
assert_true ( nr2 > 0 )
assert_true ( nr2 >
1 )
assert_false ( nr2 > 2 )
assert_false ( nr2
> 3 )
if has ( 'float' )
var ff = 2 .0
assert_true ( ff > 0 .0 )
assert_true ( ff > 1 .0 )
assert_false ( ff > 2 .0 )
assert_false ( ff > 3 .0 )
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
" test >= comperator
def Test_expr4_greaterequal ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_true ( 2 > = 0 )
assert_true ( 2 > =
2 )
assert_false ( 2 > = 3 )
var nr2 = 2
assert_true ( nr2 > = 0 )
assert_true ( nr2 > = 2 )
assert_false ( nr2 > = 3 )
if has ( 'float' )
var ff = 2 .0
assert_true ( ff > = 0 .0 )
assert_true ( ff > = 2 .0 )
assert_false ( ff > = 3 .0 )
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
" test < comperator
def Test_expr4_smaller ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_false ( 2 < 0 )
assert_false ( 2 <
2 )
assert_true ( 2
< 3 )
var nr2 = 2
assert_false ( nr2 < 0 )
assert_false ( nr2 < 2 )
assert_true ( nr2 < 3 )
if has ( 'float' )
var ff = 2 .0
assert_false ( ff < 0 .0 )
assert_false ( ff < 2 .0 )
assert_true ( ff < 3 .0 )
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
" test <= comperator
def Test_expr4_smallerequal ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_false ( 2 < = 0 )
assert_false ( 2 < =
1 )
assert_true ( 2
< = 2 )
assert_true ( 2 < = 3 )
var nr2 = 2
assert_false ( nr2 < = 0 )
assert_false ( nr2 < = 1 )
assert_true ( nr2 < = 2 )
assert_true ( nr2 < = 3 )
if has ( 'float' )
var ff = 2 .0
assert_false ( ff < = 0 .0 )
assert_false ( ff < = 1 .0 )
assert_true ( ff < = 2 .0 )
assert_true ( ff < = 3 .0 )
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
" test =~ comperator
def Test_expr4_match ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( false , '2' = ~ '0' )
assert_equal ( false , ''
= ~ '0' )
assert_equal ( true , '2' = ~
'[0-9]' )
set ignorecase
assert_equal ( false , 'abc' = ~ 'ABC' )
assert_equal ( false , 'abc' = ~ # 'ABC' )
assert_equal ( true , 'abc' = ~ ? 'ABC' )
set noignorecase
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
" test !~ comperator
def Test_expr4_nomatch ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( true , '2' ! ~ '0' )
assert_equal ( true , ''
! ~ '0' )
assert_equal ( false , '2' ! ~
'[0-9]' )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
" test is comperator
def Test_expr4_is ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
var mylist = [2 ]
assert_false ( mylist is [2 ])
var other = mylist
assert_true ( mylist is
other )
var myblob = 0 z1234
assert_false ( myblob
is 0 z1234 )
var otherblob = myblob
assert_true ( myblob is otherblob )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
" test isnot comperator
def Test_expr4_isnot ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
var mylist = [2 ]
assert_true ( '2' isnot '0' )
assert_true ( mylist isnot [2 ])
var other = mylist
assert_false ( mylist isnot
other )
var myblob = 0 z1234
assert_true ( myblob
isnot 0 z1234 )
var otherblob = myblob
assert_false ( myblob isnot otherblob )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2022-01-29 21:45:34 +00:00
def g :RetVoid ( )
2020-09-27 17:57:43 +02:00
var x = 1
2020-01-26 15:56:19 +01:00
enddef
2020-08-10 22:40:56 +02:00
def Test_expr4_vim9script ( )
2020-07-17 20:36:00 +02:00
# check line continuation
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 0
2020-06-26 22:00:38 +02:00
< 1
2020-09-27 21:58:45 +02:00
assert_equal ( true , name )
2020-06-26 22:00:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 22:00:38 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 123
2020-10-11 21:34:41 +02:00
# comment
2020-06-26 22:00:38 +02:00
! = 123
2020-09-27 21:58:45 +02:00
assert_equal ( false , name )
2020-06-26 22:00:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 21:18:00 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 123 = =
2020-06-27 21:18:00 +02:00
123
2020-09-27 21:58:45 +02:00
assert_equal ( true , name )
2020-06-27 21:18:00 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 22:00:38 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var list = [1 , 2 , 3 ]
var name = list
2020-06-26 22:00:38 +02:00
is list
2020-09-27 17:57:43 +02:00
assert_equal ( true , name )
2020-06-26 22:00:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 22:00:38 +02:00
2020-10-11 21:34:41 +02:00
lines = < < trim END
var list = [1 , 2 , 3 ]
var name = list # comment
# comment
is list
assert_equal ( true , name )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-11 21:34:41 +02:00
2020-06-26 22:00:38 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var myblob = 0 z1234
var name = myblob
2020-06-26 22:00:38 +02:00
isnot 0 z11
2020-09-27 17:57:43 +02:00
assert_equal ( true , name )
2020-06-26 22:00:38 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-10 22:45:38 +02:00
2020-07-17 20:36:00 +02:00
# spot check mismatching types
2020-07-10 22:45:38 +02:00
lines = < < trim END
echo '' = = 0
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1072:' , 1 )
2020-07-10 22:45:38 +02:00
lines = < < trim END
echo v :true > v :false
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'Cannot compare bool with bool' , 1 )
2020-07-10 22:45:38 +02:00
lines = < < trim END
echo 123 is 123
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'Cannot use "is" with number' , 1 )
2020-07-21 21:31:00 +02:00
2020-08-05 11:51:30 +02:00
# check missing white space
lines = < < trim END
echo 2 > 3
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''>'' at ">3"' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 11:51:30 +02:00
lines = < < trim END
echo 2 > 3
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 11:51:30 +02:00
lines = < < trim END
echo 2 > 3
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 11:51:30 +02:00
lines = < < trim END
echo 2 ! = 3
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 11:51:30 +02:00
lines = < < trim END
echo 2 ! = 3
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''!='' at "!=3"' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 11:51:30 +02:00
lines = < < trim END
echo 2 ! = 3
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2020-08-10 22:40:56 +02:00
2021-05-28 17:52:40 +02:00
for op in ['==' , '>' , '>=' , '<' , '<=' , '=~' , '!~' , 'is' , 'isnot' ]
lines = ["echo 'aaa'" , op .. "'bbb'" , '# comment' ]
var msg = printf ( "E1004: White space required before and after '%s'" , op )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , msg , 2 )
2021-05-28 17:52:40 +02:00
endfor
2020-08-10 22:40:56 +02:00
lines = < < trim END
echo len ( 'xxx' ) = = 3
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-16 18:42:53 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var line = 'abc'
2020-08-16 18:42:53 +02:00
echo line [1 ] = ~ '\w'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 22:00:38 +02:00
enddef
2020-01-26 15:56:19 +01:00
func Test_expr4_fails ( )
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '>'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1>2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 >2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1> 2" ], msg , 1 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '=='"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1==2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 ==2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1== 2" ], msg , 1 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after 'is'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = '1'is'2'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1' is'2'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1'is '2'" ], msg , 1 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after 'isnot'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = '1'isnot'2'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1' isnot'2'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1'isnot '2'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 is# 2" ], 'E15:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 is? 2" ], 'E15:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 isnot# 2" ], 'E15:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 isnot? 2" ], 'E15:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 == '2'" ], 'Cannot compare number with string' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1' == 2" ], 'Cannot compare string with number' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 == g:RetVoid()" ], 'Cannot compare number with void' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = g:RetVoid() == 1" ], 'Cannot compare void with number' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = true > false" ], 'Cannot compare bool with bool' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = true >= false" ], 'Cannot compare bool with bool' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = true < false" ], 'Cannot compare bool with bool' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = true <= false" ], 'Cannot compare bool with bool' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = true =~ false" ], 'Cannot compare bool with bool' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = true !~ false" ], 'Cannot compare bool with bool' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = true is false" ], 'Cannot use "is" with bool' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = true isnot false" ], 'Cannot use "isnot" with bool' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = v:none is v:null" ], 'Cannot use "is" with special' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = v:none isnot v:null" ], 'Cannot use "isnot" with special' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 123 is 123" ], 'Cannot use "is" with number' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 123 isnot 123" ], 'Cannot use "isnot" with number' , 1 )
2020-01-26 15:56:19 +01:00
if has ( 'float' )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1.3 is 1.3" ], 'Cannot use "is" with float' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1.3 isnot 1.3" ], 'Cannot use "isnot" with float' , 1 )
2020-01-26 15:56:19 +01:00
endif
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 0za1 > 0z34" ], 'Cannot compare blob with blob' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0za1 >= 0z34" ], 'Cannot compare blob with blob' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0za1 < 0z34" ], 'Cannot compare blob with blob' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0za1 <= 0z34" ], 'Cannot compare blob with blob' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0za1 =~ 0z34" ], 'Cannot compare blob with blob' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0za1 !~ 0z34" ], 'Cannot compare blob with blob' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [13] > [88]" ], 'Cannot compare list with list' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [13] >= [88]" ], 'Cannot compare list with list' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [13] < [88]" ], 'Cannot compare list with list' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [13] <= [88]" ], 'Cannot compare list with list' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [13] =~ [88]" ], 'Cannot compare list with list' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [13] !~ [88]" ], 'Cannot compare list with list' , 1 )
call v9 .CheckDefAndScriptFailure ( ['var j: job' , 'var chan: channel' , 'var r = j == chan' ], 'Cannot compare job with channel' , 3 )
call v9 .CheckDefAndScriptFailure ( ['var j: job' , 'var x: list<any>' , 'var r = j == x' ], 'Cannot compare job with list' , 3 )
call v9 .CheckDefAndScriptFailure ( ['var j: job' , 'var Xx: func' , 'var r = j == Xx' ], 'Cannot compare job with func' , 3 )
call v9 .CheckDefAndScriptFailure ( ['var j: job' , 'var Xx: func' , 'var r = j == Xx' ], 'Cannot compare job with func' , 3 )
2020-01-26 15:56:19 +01:00
endfunc
" test addition, subtraction, concatenation
def Test_expr5 ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( 66 , 60 + 6 )
assert_equal ( 70 , 60 +
g :anint )
assert_equal ( 9 , g :thefour
+ 5 )
assert_equal ( 14 , g :thefour + g :anint )
assert_equal ( [1 , 2 , 3 , 4 ], [1 ] + g :alist )
assert_equal ( 54 , 60 - 6 )
assert_equal ( 50 , 60 -
g :anint )
assert_equal ( -1 , g :thefour
- 5 )
assert_equal ( -6 , g :thefour - g :anint )
assert_equal ( 'hello' , 'hel' .. 'lo' )
assert_equal ( 'hello 123' , 'hello ' ..
123 )
assert_equal ( 'hello 123' , 'hello '
.. 123 )
assert_equal ( '123 hello' , 123 .. ' hello' )
assert_equal ( '123456' , 123 .. 456 )
2021-01-01 15:11:04 +01:00
assert_equal ( 'atrue' , 'a' .. true )
assert_equal ( 'afalse' , 'a' .. false )
2021-01-03 21:53:53 +01:00
assert_equal ( 'anull' , 'a' .. v :null )
2020-11-12 20:16:39 +01:00
assert_equal ( 'av:none' , 'a' .. v :none )
if has ( 'float' )
assert_equal ( 'a0.123' , 'a' .. 0 .123 )
endif
2020-08-12 21:34:49 +02:00
2021-01-31 21:47:42 +01:00
assert_equal ( 3 , 1 + [2 , 3 , 4 ][0 ])
assert_equal ( 5 , 2 + {key : 3 }['key' ])
2021-01-01 15:11:04 +01:00
set digraph
assert_equal ( 'val: true' , 'val: ' .. &digraph )
set nodigraph
assert_equal ( 'val: false' , 'val: ' .. &digraph )
2020-11-12 20:16:39 +01:00
assert_equal ( [1 , 2 , 3 , 4 ], [1 , 2 ] + [3 , 4 ])
assert_equal ( 0 z11223344 , 0 z1122 + 0 z3344 )
assert_equal ( 0 z112201 ab, 0 z1122
+ g :ablob )
assert_equal ( 0 z01 ab3344 , g :ablob + 0 z3344 )
assert_equal ( 0 z01 ab01 ab, g :ablob + g :ablob )
2020-08-21 20:43:17 +02:00
2020-11-12 20:16:39 +01:00
# concatenate non - constant to constant
var save_path = &path
&path = 'b'
assert_equal ( 'ab' , 'a' .. &path )
&path = save_path
2020-08-21 20:43:17 +02:00
2020-11-12 20:16:39 +01:00
@b = 'b'
assert_equal ( 'ab' , 'a' .. @b )
2020-08-21 20:43:17 +02:00
2020-11-12 20:16:39 +01:00
$ENVVAR = 'env'
assert_equal ( 'aenv' , 'a' .. $ENVVAR )
2021-01-04 17:40:12 +01:00
assert_equal ( 'val' , '' .. {key : 'val' }['key' ])
2020-11-12 20:16:39 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2020-06-24 18:37:35 +02:00
def Test_expr5_vim9script ( )
2020-07-29 21:20:41 +02:00
# check line continuation
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 11
2020-06-24 18:37:35 +02:00
+ 77
- 22
2020-09-27 21:58:45 +02:00
assert_equal ( 66 , name )
2020-06-24 18:37:35 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-24 18:37:35 +02:00
2020-08-05 11:36:52 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 11 +
2020-08-05 11:36:52 +02:00
77 -
22
2020-09-27 21:58:45 +02:00
assert_equal ( 66 , name )
2020-08-05 11:36:52 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-05 11:36:52 +02:00
2020-10-11 21:34:41 +02:00
lines = < < trim END
var name = 11 + # comment
77 -
# comment
22
assert_equal ( 66 , name )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-11 21:34:41 +02:00
2020-06-24 18:37:35 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 'one'
2020-06-24 18:37:35 +02:00
.. 'two'
2020-09-27 21:58:45 +02:00
assert_equal ( 'onetwo' , name )
2020-06-24 18:37:35 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-29 21:20:41 +02:00
lines = < < trim END
echo 'abc' is # 'abc'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' , 1 )
2020-07-29 21:20:41 +02:00
2020-10-22 19:00:01 +02:00
lines = < < trim END
echo {} - 22
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1036:' , 'E728:' ], 1 )
2020-10-22 20:09:43 +02:00
lines = < < trim END
echo [] - 33
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1036:' , 'E745:' ], 1 )
2020-10-22 20:09:43 +02:00
lines = < < trim END
echo 0 z1234 - 44
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1036' , 'E974:' ], 1 )
2020-10-22 19:00:01 +02:00
2020-07-29 21:20:41 +02:00
lines = < < trim END
echo 'abc' is ? 'abc'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' , 1 )
2020-07-29 21:20:41 +02:00
lines = < < trim END
echo 'abc' isnot # 'abc'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' , 1 )
2020-07-29 21:20:41 +02:00
lines = < < trim END
echo 'abc' isnot ? 'abc'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' , 1 )
2020-08-05 10:53:21 +02:00
# check white space
lines = < < trim END
echo 5 + 6
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2020-08-05 10:53:21 +02:00
lines = < < trim END
echo 5 + 6
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 10:53:21 +02:00
lines = < < trim END
echo 5 + 6
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2020-08-05 10:53:21 +02:00
lines = < < trim END
echo 'a' ..'b'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''..'' at "..''b''"' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 10:53:21 +02:00
lines = < < trim END
echo 'a' ..'b'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 10:53:21 +02:00
lines = < < trim END
echo 'a' .. 'b'
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''..'' at ".. ''b''"' , 1 )
2021-05-28 13:50:17 +02:00
lines = < < trim END
echo 'a'
..'b'
# comment
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004: White space required before and after ''..'' at "..''b''"' , 2 )
2020-08-12 21:34:49 +02:00
# check invalid string concatenation
lines = < < trim END
echo 'a' .. [1 ]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105:' , 'E730:' ], 1 )
2021-04-04 20:49:50 +02:00
2020-08-12 21:34:49 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
echo 'a' .. {a : 1 }
2020-08-12 21:34:49 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105:' , 'E731:' ], 1 )
2021-04-04 20:49:50 +02:00
2020-08-12 21:34:49 +02:00
lines = < < trim END
echo 'a' .. test_void ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105:' , 'E908:' ], 1 )
2021-04-04 20:49:50 +02:00
2020-08-12 21:34:49 +02:00
lines = < < trim END
echo 'a' .. 0 z33
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105:' , 'E976:' ], 1 )
2021-04-04 20:49:50 +02:00
2020-08-12 21:34:49 +02:00
lines = < < trim END
echo 'a' .. function ( 'len' )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105:' , 'E729:' ], 1 )
2021-03-06 18:18:19 +01:00
lines = < < trim END
new
['' ]- > setline ( 1 )
/pattern
eval 0
bwipe !
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , "E1004: White space required before and after '/' at \"/pattern" , 3 )
2021-05-28 17:52:40 +02:00
for op in ['+' , '-' ]
lines = ['var x = 1' , op .. '2' , '# comment' ]
var msg = printf ( "E1004: White space required before and after '%s' at \"%s2\"" , op , op )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , msg , 2 )
2021-05-28 17:52:40 +02:00
endfor
2020-09-05 20:06:33 +02:00
enddef
def Test_expr5_vim9script_channel ( )
if ! has ( 'channel' )
2021-08-07 15:50:23 +02:00
MissingFeature 'channel'
2020-09-05 20:06:33 +02:00
else
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-09-05 20:06:33 +02:00
echo 'a' .. test_null_job ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105:' , 'E908:' ], 1 )
2020-09-05 20:06:33 +02:00
lines = < < trim END
echo 'a' .. test_null_channel ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1105:' , 'E908:' ], 1 )
2020-09-05 20:06:33 +02:00
endif
2020-06-24 18:37:35 +02:00
enddef
2020-01-26 15:56:19 +01:00
def Test_expr5_float ( )
2020-01-31 22:12:41 +01:00
if ! has ( 'float' )
MissingFeature 'float'
else
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( 66 .0 , 60 .0 + 6 .0 )
assert_equal ( 66 .0 , 60 .0 + 6 )
assert_equal ( 66 .0 , 60 +
6 .0 )
assert_equal ( 5 .1 , g :afloat
+ 5 )
assert_equal ( 8 .1 , 8 + g :afloat )
assert_equal ( 10 .1 , g :anint + g :afloat )
assert_equal ( 10 .1 , g :afloat + g :anint )
assert_equal ( 54 .0 , 60 .0 - 6 .0 )
assert_equal ( 54 .0 , 60 .0
- 6 )
assert_equal ( 54 .0 , 60 - 6 .0 )
assert_equal ( -4 .9 , g :afloat - 5 )
assert_equal ( 7 .9 , 8 - g :afloat )
assert_equal ( 9 .9 , g :anint - g :afloat )
assert_equal ( -9 .9 , g :afloat - g :anint )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-31 22:12:41 +01:00
endif
2020-01-26 15:56:19 +01:00
enddef
func Test_expr5_fails ( )
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '+'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1+2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 +2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1+ 2" ], msg , 1 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '-'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1-2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 -2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1- 2" ], msg , 1 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '..'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = '1'..'2'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1' ..'2'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1'.. '2'" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0z1122 + 33" ], ['E1051:' , 'E974:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0z1122 + [3]" ], ['E1051:' , 'E974:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0z1122 + 'asd'" ], ['E1051:' , 'E974:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 33 + 0z1122" ], ['E1051:' , 'E974:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [3] + 0z1122" ], ['E1051:' , 'E745:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 'asdf' + 0z1122" ], ['E1051:' , 'E1030:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 6 + xxx" ], ['E1001:' , 'E121:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. [1]" ], ['E1105:' , 'E730:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. {a: 1}" ], ['E1105:' , 'E731:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. test_void()" ], ['E1105:' , 'E908:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. 0z32" ], ['E1105:' , 'E976:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. function('len')" ], ['E1105:' , 'E729:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. function('len', ['a'])" ], ['E1105:' , 'E729:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ['var x = 1 + v:none' ], ['E1051:' , 'E611:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ['var x = 1 + v:null' ], ['E1051:' , 'E611:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ['var x = 1 + v:true' ], ['E1051:' , 'E1138:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ['var x = 1 + v:false' ], ['E1051:' , 'E1138:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ['var x = 1 + true' ], ['E1051:' , 'E1138:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ['var x = 1 + false' ], ['E1051:' , 'E1138:' ], 1 )
2020-09-05 20:06:33 +02:00
endfunc
func Test_expr5_fails_channel ( )
2022-01-31 13:36:36 +00:00
CheckFeature channel
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. test_null_job()" ], ['E1105:' , 'E908:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. test_null_channel()" ], ['E1105:' , 'E908:' ], 1 )
2020-01-26 15:56:19 +01:00
endfunc
2020-12-15 21:28:57 +01:00
def Test_expr5_list_add ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
# concatenating two lists with same member types is OK
var d = {}
for i in ['a' ] + ['b' ]
d = {[i ]: 0 }
endfor
# concatenating two lists with different member types results in "any"
var dany = {}
for i in ['a' ] + [12 ]
dany [i ] = i
endfor
assert_equal ( {a : 'a' , 12 : 12 }, dany )
# result of glob ( ) is "any" , runtime type check
var sl : list < string > = glob ( '*.txt' , false , true ) + ['' ]
2022-02-03 21:47:34 +00:00
var lln : list < list < number > > = [[1 ] + [2 ]]
assert_equal ( [[1 , 2 ]], lln )
2021-04-04 20:49:50 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2022-02-04 11:36:51 +00:00
lines = < < trim END
var ln : list < number > = [0 ]
var lln : list < list < number > > = [ln + []]
END
v9 .CheckDefAndScriptSuccess ( lines )
2020-12-15 21:28:57 +01:00
enddef
2020-01-26 15:56:19 +01:00
" test multiply, divide, modulo
def Test_expr6 ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( 36 , 6 * 6 )
assert_equal ( 24 , 6 *
g :thefour )
assert_equal ( 24 , g :thefour
* 6 )
assert_equal ( 40 , g :anint * g :thefour )
assert_equal ( 10 , 60 / 6 )
assert_equal ( 6 , 60 /
g :anint )
assert_equal ( 1 , g :anint / 6 )
assert_equal ( 2 , g :anint
/ g :thefour )
assert_equal ( 5 , 11 % 6 )
assert_equal ( 4 , g :anint % 6 )
assert_equal ( 3 , 13 %
g :anint )
assert_equal ( 2 , g :anint
% g :thefour )
assert_equal ( 4 , 6 * 4 / 6 )
var x = [2 ]
var y = [3 ]
assert_equal ( 5 , x [0 ] + y [0 ])
assert_equal ( 6 , x [0 ] * y [0 ])
if has ( 'float' )
var xf = [2 .0 ]
var yf = [3 .0 ]
assert_equal ( 5 .0 , xf [0 ]
+ yf [0 ])
assert_equal ( 6 .0 , xf [0 ]
* yf [0 ])
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-03-30 21:22:56 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = 6 * xxx" ], ['E1001:' , 'E121:' ], 1 )
v9 .CheckDefFailure ( ["var d = 6 * " ], 'E1097:' , 3 )
v9 .CheckScriptFailure ( ['vim9script' , "var d = 6 * " ], 'E15:' , 2 )
2021-01-20 21:23:14 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ['echo 1 / 0' ], 'E1154' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['echo 1 % 0' ], 'E1154' , 1 )
2021-08-07 15:50:23 +02:00
2022-02-17 19:44:07 +00:00
if has ( 'float' )
v9 .CheckDefExecAndScriptFailure ( [
'g:one = 1.0'
'g:two = 2.0'
'echo g:one % g:two'
], 'E804' , 3 )
endif
2021-08-07 15:50:23 +02:00
lines = < < trim END
var n = 0
eval 1 / n
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1154' , 2 )
2021-08-07 15:50:23 +02:00
lines = < < trim END
var n = 0
eval 1 % n
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , 'E1154' , 2 )
2020-01-26 15:56:19 +01:00
enddef
2020-06-24 18:37:35 +02:00
def Test_expr6_vim9script ( )
2020-08-05 11:36:52 +02:00
# check line continuation
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 11
2020-06-24 18:37:35 +02:00
* 22
/ 3
2020-09-27 21:58:45 +02:00
assert_equal ( 80 , name )
2020-06-24 18:37:35 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-24 18:37:35 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 25
2020-06-24 18:37:35 +02:00
% 10
2020-09-27 21:58:45 +02:00
assert_equal ( 5 , name )
2020-06-24 18:37:35 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-05 11:36:52 +02:00
2020-10-11 21:34:41 +02:00
lines = < < trim END
var name = 25
# comment
# comment
% 10
assert_equal ( 5 , name )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-10-11 21:34:41 +02:00
2020-08-05 11:36:52 +02:00
lines = < < trim END
2020-09-27 21:58:45 +02:00
var name = 11 *
2020-08-05 11:36:52 +02:00
22 /
3
2020-09-27 21:58:45 +02:00
assert_equal ( 80 , name )
2020-08-05 11:36:52 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-05 11:36:52 +02:00
# check white space
lines = < < trim END
echo 5 *6
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 11:36:52 +02:00
lines = < < trim END
echo 5 *6
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-05 11:36:52 +02:00
lines = < < trim END
echo 5 * 6
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1004:' , 1 )
2020-06-24 18:37:35 +02:00
enddef
2020-01-26 15:56:19 +01:00
def Test_expr6_float ( )
2020-01-31 22:12:41 +01:00
if ! has ( 'float' )
MissingFeature 'float'
else
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( 36 .0 , 6 .0 * 6 )
assert_equal ( 36 .0 , 6 *
6 .0 )
assert_equal ( 36 .0 , 6 .0 * 6 .0 )
assert_equal ( 1 .0 , g :afloat * g :anint )
assert_equal ( 10 .0 , 60 / 6 .0 )
assert_equal ( 10 .0 , 60 .0 /
6 )
assert_equal ( 10 .0 , 60 .0 / 6 .0 )
assert_equal ( 0 .01 , g :afloat / g :anint )
assert_equal ( 4 .0 , 6 .0 * 4 / 6 )
assert_equal ( 4 .0 , 6 *
4 .0 /
6 )
assert_equal ( 4 .0 , 6 * 4 / 6 .0 )
assert_equal ( 4 .0 , 6 .0 * 4 .0 / 6 )
assert_equal ( 4 .0 , 6 * 4 .0 / 6 .0 )
assert_equal ( 4 .0 , 6 .0 * 4 / 6 .0 )
assert_equal ( 4 .0 , 6 .0 * 4 .0 / 6 .0 )
assert_equal ( 4 .0 , 6 .0 * 4 .0 / 6 .0 )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-31 22:12:41 +01:00
endif
2020-01-26 15:56:19 +01:00
enddef
func Test_expr6_fails ( )
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '*'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1*2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 *2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1* 2" ], msg , 1 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '/'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1/2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 /2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1/ 2" ], msg , 1 )
2020-01-26 15:56:19 +01:00
2020-09-16 17:55:40 +02:00
let msg = "White space required before and after '%'"
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1%2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1 %2" ], msg , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 1% 2" ], msg , 1 )
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = '1' * '2'" ], ['E1036:' , 'E1030:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1' / '2'" ], ['E1036:' , 'E1030:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1' % '2'" ], ['E1035:' , 'E1030:' ], 1 )
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 0z01 * 0z12" ], ['E1036:' , 'E974:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0z01 / 0z12" ], ['E1036:' , 'E974:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 0z01 % 0z12" ], ['E1035:' , 'E974:' ], 1 )
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = [1] * [2]" ], ['E1036:' , 'E745:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [1] / [2]" ], ['E1036:' , 'E745:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = [1] % [2]" ], ['E1035:' , 'E745:' ], 1 )
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = {one: 1} * {two: 2}" ], ['E1036:' , 'E728:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = {one: 1} / {two: 2}" ], ['E1036:' , 'E728:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = {one: 1} % {two: 2}" ], ['E1035:' , 'E728:' ], 1 )
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 0xff[1]" ], ['E1107:' , 'E1062:' ], 1 )
2020-02-17 21:12:08 +01:00
if has ( 'float' )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 0.7[1]" ], ['E1107:' , 'E806:' ], 1 )
2020-02-17 21:12:08 +01:00
endif
2021-05-28 17:52:40 +02:00
for op in ['*' , '/' , '%' ]
let lines = ['var x = 1' , op .. '2' , '# comment' ]
let msg = printf ( "E1004: White space required before and after '%s' at \"%s2\"" , op , op )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( lines , msg , 2 )
2021-05-28 17:52:40 +02:00
endfor
2020-01-26 15:56:19 +01:00
endfunc
func Test_expr6_float_fails ( )
2022-01-31 13:36:36 +00:00
CheckFeature float
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = 1.0 % 2" ], ['E1035:' , 'E804:' ], 1 )
2020-01-26 15:56:19 +01:00
endfunc
" define here to use old style parsing
if has ( 'float' )
let g :float_zero = 0 .0
let g :float_neg = -9 .8
let g :float_big = 9 .9 e99
endif
let g :blob_empty = 0 z
let g :blob_one = 0 z01
let g :blob_long = 0 z0102 .0304
let g :string_empty = ''
let g :string_short = 'x'
let g :string_long = 'abcdefghijklm'
let g :string_special = "ab\ncd\ref\ekk"
let g :special_true = v :true
let g :special_false = v :false
let g :special_null = v :null
let g :special_none = v :none
let g :list_empty = []
let g :list_mixed = [1 , 'b' , v :false ]
let g :dict_empty = {}
let g :dict_one = #{one : 1 }
let $TESTVAR = 'testvar'
2020-08-09 19:02:50 +02:00
" type casts
2022-01-17 20:50:40 +00:00
def Test_expr7 ( )
2021-04-21 17:57:26 +02:00
var lines = < < trim END
var ls : list < string > = ['a' , < string > g :string_empty ]
var ln : list < number > = [< number > g :anint , < number > g :thefour ]
var nr = < number > 234
assert_equal ( 234 , nr )
2021-05-25 20:14:00 +02:00
var b : bool = < bool > 1
assert_equal ( true , b )
2021-04-21 17:57:26 +02:00
var text =
< string >
'text'
if false
text = < number > 'xxx'
endif
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-14 22:44:25 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = <nr>123" ], 'E1010:' , 1 )
v9 .CheckDefFailure ( ["var x = <number>" ], 'E1097:' , 3 )
v9 .CheckDefFailure ( ["var x = <number>string(1)" ], 'E1012:' , 1 )
v9 .CheckScriptFailure ( ['vim9script' , "var x = <number>" ], 'E15:' , 2 )
v9 .CheckDefAndScriptFailure ( ["var x = <number >123" ], 'E1068:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = <number 123" ], 'E1104:' , 1 )
2020-08-09 19:02:50 +02:00
enddef
2020-01-26 15:56:19 +01:00
" test low level expression
2022-01-17 20:50:40 +00:00
def Test_expr8_number ( )
2020-07-17 20:36:00 +02:00
# number constant
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( 0 , 0 )
assert_equal ( 654 , 0654 )
2020-01-26 15:56:19 +01:00
2020-11-12 20:16:39 +01:00
assert_equal ( 6 , 0 x6 )
assert_equal ( 15 , 0 xf)
assert_equal ( 255 , 0 xff)
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_float ( )
2020-07-17 20:36:00 +02:00
# float constant
2020-01-31 22:12:41 +01:00
if ! has ( 'float' )
MissingFeature 'float'
else
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( g :float_zero , .0 )
assert_equal ( g :float_zero , 0 .0 )
assert_equal ( g :float_neg , -9 .8 )
assert_equal ( g :float_big , 9 .9 e99 )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
endif
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_blob ( )
2020-07-17 20:36:00 +02:00
# blob constant
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( g :blob_empty , 0 z)
assert_equal ( g :blob_one , 0 z01 )
assert_equal ( g :blob_long , 0 z0102 .0304 )
2021-04-11 20:26:34 +02:00
var testblob = 0 z010203
assert_equal ( 0 x01 , testblob [0 ])
assert_equal ( 0 x02 , testblob [1 ])
assert_equal ( 0 x03 , testblob [-1 ])
assert_equal ( 0 x02 , testblob [-2 ])
assert_equal ( 0 z01 , testblob [0 : 0 ])
assert_equal ( 0 z0102 , testblob [0 : 1 ])
assert_equal ( 0 z010203 , testblob [0 : 2 ])
assert_equal ( 0 z010203 , testblob [0 : ])
assert_equal ( 0 z0203 , testblob [1 : ])
assert_equal ( 0 z0203 , testblob [1 : 2 ])
assert_equal ( 0 z0203 , testblob [1 : -1 ])
assert_equal ( 0 z03 , testblob [-1 : -1 ])
assert_equal ( 0 z02 , testblob [-2 : -2 ])
# blob slice accepts out of range
assert_equal ( 0 z, testblob [3 : 3 ])
assert_equal ( 0 z, testblob [0 : -4 ])
2020-11-12 20:16:39 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-03-30 21:22:56 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = 0z123" ], 'E973:' , 1 )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_string ( )
2020-07-17 20:36:00 +02:00
# string constant
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( g :string_empty , '' )
assert_equal ( g :string_empty , "" )
assert_equal ( g :string_short , 'x' )
assert_equal ( g :string_short , "x" )
assert_equal ( g :string_long , 'abcdefghijklm' )
assert_equal ( g :string_long , "abcdefghijklm" )
assert_equal ( g :string_special , "ab\ncd\ref\ekk" )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-03-30 21:22:56 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ['var x = "abc' ], 'E114:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = 'abc" ], 'E115:' , 1 )
2022-02-04 21:17:58 +00:00
v9 .CheckDefFailure ( ["if 0" , "echo 'xx" , "endif" ], 'E115' , 2 )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_vimvar ( )
2021-12-24 21:36:12 +00:00
v :errors = []
var errs : list < string > = v :errors
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var errs: list<number> = v:errors' ], 'E1012:' )
2021-12-24 21:36:12 +00:00
2020-09-27 17:57:43 +02:00
var old : list < string > = v :oldfiles
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var old: list<number> = v:oldfiles' ], 'E1012:' )
2021-12-24 21:36:12 +00:00
var compl : dict < string > = v :completed_item
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var compl: dict<number> = v:completed_item' ], 'E1012:' )
2021-12-24 21:36:12 +00:00
var args : list < string > = v :argv
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var args: list<number> = v:argv' ], 'E1012:' )
2021-12-24 21:36:12 +00:00
var colors : dict < string > = v :colornames
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var colors: dict<number> = v:colornames' ], 'E1012:' )
2020-04-09 19:34:43 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ["var old: list<number> = v:oldfiles" ], 'E1012: Type mismatch; expected list<number> but got list<string>' , 1 )
v9 .CheckScriptFailure ( ['vim9script' , 'v:oldfiles = ["foo"]' , "var old: list<number> = v:oldfiles" ], 'E1012: Type mismatch; expected list<number> but got list<string>' , 3 )
2020-09-16 15:22:00 +02:00
new
exec "normal! afoo fo\<C-N>\<Esc>"
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ["var old: dict<number> = v:completed_item" ], 'E1012: Type mismatch; expected dict<number> but got dict<string>' , 1 )
2020-09-16 15:22:00 +02:00
bwipe !
2020-04-09 19:34:43 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_special ( )
2020-07-17 20:36:00 +02:00
# special constant
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-11-12 20:16:39 +01:00
assert_equal ( g :special_true , true )
assert_equal ( g :special_false , false )
assert_equal ( g :special_true , v :true )
assert_equal ( g :special_false , v :false )
2020-07-13 21:59:33 +02:00
assert_equal ( v :true , true )
assert_equal ( v :false , false )
2020-11-12 20:16:39 +01:00
2020-08-09 22:17:55 +02:00
assert_equal ( true , ! false )
assert_equal ( false , ! true )
assert_equal ( true , ! 0 )
assert_equal ( false , ! 1 )
assert_equal ( false , ! ! false )
assert_equal ( true , ! ! true )
assert_equal ( false , ! ! 0 )
assert_equal ( true , ! ! 1 )
2020-11-12 20:16:39 +01:00
var t = true
var f = false
assert_equal ( true , t )
assert_equal ( false , f )
assert_equal ( g :special_null , v :null )
2021-01-03 21:53:53 +01:00
assert_equal ( g :special_null , null )
2020-11-12 20:16:39 +01:00
assert_equal ( g :special_none , v :none )
2020-07-13 21:59:33 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-11-12 20:16:39 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ['v:true = true' ], 'E46:' , 1 )
v9 .CheckDefAndScriptFailure ( ['v:true = false' ], 'E46:' , 1 )
v9 .CheckDefAndScriptFailure ( ['v:false = true' ], 'E46:' , 1 )
v9 .CheckDefAndScriptFailure ( ['v:null = 11' ], 'E46:' , 1 )
v9 .CheckDefAndScriptFailure ( ['v:none = 22' ], 'E46:' , 1 )
2020-07-13 21:59:33 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_list ( )
2020-07-17 20:36:00 +02:00
# list
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( g :list_empty , [])
assert_equal ( g :list_empty , [ ])
2020-08-09 17:22:04 +02:00
2020-11-12 20:16:39 +01:00
var numbers : list < number > = [1 , 2 , 3 ]
numbers = [1 ]
numbers = []
2020-08-09 17:22:04 +02:00
2020-11-12 20:16:39 +01:00
var strings : list < string > = ['a' , 'b' , 'c' ]
strings = ['x' ]
strings = []
2020-08-09 17:22:04 +02:00
2020-11-12 20:16:39 +01:00
var mixed : list < any > = [1 , 'b' , false , ]
assert_equal ( g :list_mixed , mixed )
assert_equal ( 'b' , mixed [1 ])
2020-02-20 22:14:31 +01:00
2020-11-12 20:16:39 +01:00
echo [1 ,
2 ] [3 ,
4 ]
2020-07-31 22:38:17 +02:00
2020-11-12 20:16:39 +01:00
var llstring : list < list < string > > = [['text' ], []]
llstring = [[], ['text' ]]
llstring = [[], []]
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-09-19 14:12:34 +02:00
2020-09-27 17:45:03 +02:00
var rangelist : list < number > = range ( 3 )
g :rangelist = range ( 3 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ["var x: list<string> = g:rangelist" ], 'E1012: Type mismatch; expected list<string> but got list<number>' , 1 )
2020-09-27 17:45:03 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = 1234[3]" ], ['E1107:' , 'E1062:' ], 1 )
v9 .CheckDefExecAndScriptFailure ( ["var x = g:anint[3]" ], 'E1062:' , 1 )
2020-08-16 14:48:19 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = g:list_mixed[xxx]" ], ['E1001:' , 'E121:' ], 1 )
2020-08-12 18:01:53 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = [1,2,3]" ], 'E1069:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = [1 ,2, 3]" ], 'E1068:' , 1 )
2020-08-12 18:01:53 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ["echo 1" , "var x = [][0]" , "echo 3" ], 'E684:' , 2 )
2020-08-18 13:41:50 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ["var x = g:list_mixed['xx']" ], ['E1012:' , 'E1030:' ], 1 )
v9 .CheckDefFailure ( ["var x = g:list_mixed[" ], 'E1097:' , 3 )
v9 .CheckScriptFailure ( ['vim9script' , "var x = g:list_mixed[" ], 'E15:' , 2 )
v9 .CheckDefFailure ( ["var x = g:list_mixed[0" ], 'E1097:' , 3 )
v9 .CheckScriptFailure ( ['vim9script' , "var x = g:list_mixed[0" ], 'E111:' , 2 )
v9 .CheckDefExecAndScriptFailure ( ["var x = g:list_empty[3]" ], 'E684:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ["var l: list<number> = [234, 'x']" ], 'E1012:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ["var l: list<number> = ['x', 234]" ], 'E1012:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ["var l: list<string> = [234, 'x']" ], 'E1012:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ["var l: list<string> = ['x', 123]" ], 'E1012:' , 1 )
2020-10-03 13:41:53 +02:00
2020-11-12 20:16:39 +01:00
lines = < < trim END
2020-10-03 13:41:53 +02:00
var datalist : list < string >
def Main ( )
datalist + = ['x' .
enddef
Main ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1127:' )
2020-12-30 20:39:21 +01:00
lines = < < trim END
var numbers = [1 , 2 , 3 , 4 ]
var a = 1
var b = 2
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines + ['echo numbers[1:b]' ],
2021-01-01 19:17:55 +01:00
'E1004: White space required before and after '':'' at ":b]"' , 4 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines + ['echo numbers[1: b]' ], 'E1004:' , 4 )
v9 .CheckDefAndScriptFailure ( lines + ['echo numbers[a :b]' ], 'E1004:' , 4 )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_list_vim9script ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
var l = [
2020-06-26 22:46:27 +02:00
11 ,
22 ,
]
assert_equal ( [11 , 22 ], l )
2020-07-31 22:38:17 +02:00
echo [1 ,
2 ] [3 ,
4 ]
2020-10-11 21:34:41 +02:00
echo [1 , # comment
# comment
2 ] [3 ,
# comment
4 ]
2020-06-26 22:46:27 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-26 22:46:27 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var l = [11 ,
2020-06-26 22:46:27 +02:00
22 ]
assert_equal ( [11 , 22 ], l )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 14:11:53 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var l = [11 , 22 ]
2020-06-27 14:11:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1069:' , 1 )
2020-08-12 18:01:53 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var l = [11 , 22 ]
2020-08-12 18:01:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1068:' , 1 )
2020-08-14 21:27:37 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var l : list < number > = [234 , 'x' ]
2020-08-14 21:27:37 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-14 21:27:37 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var l : list < number > = ['x' , 234 ]
2020-08-14 21:27:37 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-14 21:27:37 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var l : list < string > = ['x' , 234 ]
2020-08-14 21:27:37 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-14 21:27:37 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var l : list < string > = [234 , 'x' ]
2020-08-14 21:27:37 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012:' , 1 )
2020-11-04 12:00:53 +01:00
lines = < < trim END
def Failing ( )
job_stop ( )
enddef
var list = [Failing ]
END
2020-11-07 13:09:18 +01:00
if has ( 'channel' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E119:' , 0 )
2020-11-07 13:09:18 +01:00
else
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E117:' , 0 )
2020-11-07 13:09:18 +01:00
endif
2020-06-26 22:46:27 +02:00
enddef
2020-08-12 19:15:33 +02:00
def LambdaWithComments ( ) : func
2020-12-31 21:28:47 +01:00
return ( x ) = >
2020-08-12 19:15:33 +02:00
# some comment
x = = 1
# some comment
| |
x = = 2
enddef
2020-08-12 19:42:01 +02:00
def LambdaUsingArg ( x : number ) : func
2020-12-31 21:28:47 +01:00
return ( ) = >
2020-08-12 19:42:01 +02:00
# some comment
x = = 1
# some comment
| |
x = = 2
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_lambda ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
2020-12-31 21:28:47 +01:00
var La = ( ) = > 'result'
2021-04-28 20:00:40 +02:00
# comment
2020-11-12 20:16:39 +01:00
assert_equal ( 'result' , La ( ) )
2020-12-31 21:28:47 +01:00
assert_equal ( [1 , 3 , 5 ], [1 , 2 , 3 ]- > map ( ( key , val ) = > key + val ) )
2020-11-12 20:16:39 +01:00
# line continuation inside lambda with "cond ? expr : expr" works
var ll = range ( 3 )
2021-01-10 22:42:50 +01:00
var dll = mapnew ( ll , ( k , v ) = > v % 2 ? {
2020-12-02 17:36:54 +01:00
['111' ]: 111 } : {}
2020-12-31 21:28:47 +01:00
)
2021-01-10 22:42:50 +01:00
assert_equal ( [{}, {111 : 111 }, {}], dll )
2020-11-12 20:16:39 +01:00
2021-04-28 20:00:40 +02:00
# comment halfway an expression
var Ref = ( ) = > 4
# comment
+ 6
assert_equal ( 10 , Ref ( ) )
2020-11-12 20:16:39 +01:00
ll = range ( 3 )
2020-12-31 21:28:47 +01:00
map ( ll , ( k , v ) = > v = = 8 | | v
2020-11-12 20:16:39 +01:00
= = 9
| | v % 2 ? 111 : 222
2020-12-31 21:28:47 +01:00
)
2020-11-12 20:16:39 +01:00
assert_equal ( [222 , 111 , 222 ], ll )
ll = range ( 3 )
2020-12-31 21:28:47 +01:00
map ( ll , ( k , v ) = > v ! = 8 && v
2020-11-12 20:16:39 +01:00
! = 9
&& v % 2 = = 0 ? 111 : 222
2020-12-31 21:28:47 +01:00
)
2020-11-12 20:16:39 +01:00
assert_equal ( [111 , 222 , 111 ], ll )
2021-12-25 21:43:28 +00:00
var dl = [{key : 0 }, {key : 22 }]- > filter ( ( _ , v ) = > ! ! v ['key' ] )
2020-12-02 17:36:54 +01:00
assert_equal ( [{key : 22 }], dl )
2020-11-12 20:16:39 +01:00
2020-12-02 17:36:54 +01:00
dl = [{key : 12 }, {['foo' ]: 34 }]
assert_equal ( [{key : 12 }], filter ( dl ,
2020-12-31 21:28:47 +01:00
( _ , v ) = > has_key ( v , 'key' ) ? v ['key' ] = = 12 : 0 ) )
2020-11-12 20:16:39 +01:00
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :LambdaWithComments ( ) ( 0 ) )
assert_equal ( true , g :LambdaWithComments ( ) ( 1 ) )
assert_equal ( true , g :LambdaWithComments ( ) ( 2 ) )
assert_equal ( false , g :LambdaWithComments ( ) ( 3 ) )
2020-11-12 20:16:39 +01:00
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :LambdaUsingArg ( 0 ) ( ) )
assert_equal ( true , g :LambdaUsingArg ( 1 ) ( ) )
2020-11-25 21:30:11 +01:00
2020-12-31 21:28:47 +01:00
var res = map ( [1 , 2 , 3 ], ( i : number , v : number ) = > i + v )
2020-11-25 21:30:11 +01:00
assert_equal ( [1 , 3 , 5 ], res )
2020-11-12 20:16:39 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-12 19:42:01 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var Ref = (a)=>a + 1" ], 'E1004:' )
v9 .CheckDefAndScriptFailure ( ["var Ref = (a)=> a + 1" ], 'E1004: White space required before and after ''=>'' at "=> a + 1"' )
v9 .CheckDefAndScriptFailure ( ["var Ref = (a) =>a + 1" ], 'E1004:' )
v9 .CheckDefAndScriptFailure ( ["var Ref = (a) =< a + 1" ], ['E1001:' , 'E121:' ])
v9 .CheckDefAndScriptFailure ( ["var Ref = (a: int) => a + 1" ], 'E1010:' )
v9 .CheckDefAndScriptFailure ( ["var Ref = (a): int => a + 1" ], 'E1010:' )
2020-12-23 20:27:31 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["filter([1, 2], (k,v) => 1)" ], 'E1069:' , 1 )
2020-08-18 20:34:13 +02:00
# error is in first line of the lambda
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var L = (a) => a + b" ], 'E1001:' , 0 )
2020-08-14 22:16:33 +02:00
2020-12-31 21:28:47 +01:00
assert_equal ( 'xxxyyy' , 'xxx' - > ( ( a , b ) = > a .. b ) ( 'yyy' ) )
2020-08-14 22:16:33 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ["var s = 'asdf'->((a) => a)('x')" ], 'E118:' )
v9 .CheckDefExecFailure ( ["var s = 'asdf'->((a) => a)('x', 'y')" ], 'E118:' )
v9 .CheckDefAndScriptFailure ( ["echo 'asdf'->((a) => a)(x)" ], ['E1001:' , 'E121:' ], 1 )
2020-10-18 18:03:17 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( ['var Fx = (a) => ({k1: 0,' , ' k2: 1})' ])
v9 .CheckDefAndScriptFailure ( ['var Fx = (a) => ({k1: 0' , ' k2: 1})' ], 'E722:' , 2 )
v9 .CheckDefAndScriptFailure ( ['var Fx = (a) => ({k1: 0,' , ' k2 1})' ], 'E720:' , 2 )
2020-10-18 18:03:17 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( ['var Fx = (a) => [0,' , ' 1]' ])
v9 .CheckDefAndScriptFailure ( ['var Fx = (a) => [0' , ' 1]' ], 'E696:' , 2 )
2021-02-23 12:05:46 +01:00
# no error for existing script variable when checking for lambda
lines = < < trim END
var name = 0
eval ( name + 2 ) / 3
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_lambda_block ( )
2021-03-21 20:53:29 +01:00
var lines = < < trim END
var Func = ( s : string ) : string = > {
return 'hello ' .. s
}
assert_equal ( 'hello there' , Func ( 'there' ) )
var ll = range ( 3 )
var dll = mapnew ( ll , ( k , v ) : string = > {
if v % 2
return 'yes'
endif
return 'no'
})
assert_equal ( ['no' , 'yes' , 'no' ], dll )
2021-03-22 20:49:02 +01:00
2021-07-19 21:04:23 +02:00
# ignored_inline ( 0 , ( _ ) = > {
# echo 'body'
# })
2021-03-22 20:49:02 +01:00
sandbox var Safe = ( nr : number ) : number = > {
return nr + 7
}
assert_equal ( 10 , Safe ( 3 ) )
2021-03-21 20:53:29 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-03-22 18:22:30 +01:00
lines = < < trim END
map ( [1 , 2 ], ( k , v ) = > { redrawt })
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E488' )
2021-03-22 20:49:02 +01:00
lines = < < trim END
var Func = ( nr : int ) = > {
echo nr
}
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1010' , 1 )
2021-03-22 20:49:02 +01:00
lines = < < trim END
var Func = ( nr : number ) : int = > {
return nr
}
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1010' , 1 )
2021-03-22 20:49:02 +01:00
lines = < < trim END
var Func = ( nr : number ) : int = > {
return nr
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1171' , 0 ) # line nr is function start
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E1171' , 2 )
2021-03-22 20:49:02 +01:00
lines = < < trim END
var Func = ( nr : number ) : int = > {
var ll = < < ENDIT
nothing
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1145: Missing heredoc end marker: ENDIT' , 0 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E1145: Missing heredoc end marker: ENDIT' , 2 )
2021-03-21 20:53:29 +01:00
enddef
2020-12-24 15:14:01 +01:00
def NewLambdaWithComments ( ) : func
return ( x ) = >
# some comment
x = = 1
# some comment
| |
x = = 2
enddef
def NewLambdaUsingArg ( x : number ) : func
return ( ) = >
# some comment
x = = 1
# some comment
| |
x = = 2
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_new_lambda ( )
2020-12-24 15:14:01 +01:00
var lines = < < trim END
var La = ( ) = > 'result'
assert_equal ( 'result' , La ( ) )
assert_equal ( [1 , 3 , 5 ], [1 , 2 , 3 ]- > map ( ( key , val ) = > key + val ) )
# line continuation inside lambda with "cond ? expr : expr" works
var ll = range ( 3 )
2021-01-10 22:42:50 +01:00
var dll = mapnew ( ll , ( k , v ) = > v % 2 ? {
2020-12-24 15:14:01 +01:00
['111' ]: 111 } : {}
)
2021-01-10 22:42:50 +01:00
assert_equal ( [{}, {111 : 111 }, {}], dll )
2020-12-24 15:14:01 +01:00
ll = range ( 3 )
map ( ll , ( k , v ) = > v = = 8 | | v
= = 9
| | v % 2 ? 111 : 222
)
assert_equal ( [222 , 111 , 222 ], ll )
ll = range ( 3 )
map ( ll , ( k , v ) = > v ! = 8 && v
! = 9
&& v % 2 = = 0 ? 111 : 222
)
assert_equal ( [111 , 222 , 111 ], ll )
2021-12-25 21:43:28 +00:00
var dl = [{key : 0 }, {key : 22 }]- > filter ( ( _ , v ) = > ! ! v ['key' ] )
2020-12-24 15:14:01 +01:00
assert_equal ( [{key : 22 }], dl )
dl = [{key : 12 }, {['foo' ]: 34 }]
assert_equal ( [{key : 12 }], filter ( dl ,
( _ , v ) = > has_key ( v , 'key' ) ? v ['key' ] = = 12 : 0 ) )
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :NewLambdaWithComments ( ) ( 0 ) )
assert_equal ( true , g :NewLambdaWithComments ( ) ( 1 ) )
assert_equal ( true , g :NewLambdaWithComments ( ) ( 2 ) )
assert_equal ( false , g :NewLambdaWithComments ( ) ( 3 ) )
2020-12-24 15:14:01 +01:00
2022-01-29 21:45:34 +00:00
assert_equal ( false , g :NewLambdaUsingArg ( 0 ) ( ) )
assert_equal ( true , g :NewLambdaUsingArg ( 1 ) ( ) )
2020-12-24 15:14:01 +01:00
var res = map ( [1 , 2 , 3 ], ( i : number , v : number ) = > i + v )
assert_equal ( [1 , 3 , 5 ], res )
# Lambda returning a dict
2020-12-25 12:38:04 +01:00
var Lmb = ( ) = > ( {key : 42 })
2020-12-24 15:14:01 +01:00
assert_equal ( {key : 42 }, Lmb ( ) )
2020-12-25 15:24:23 +01:00
var RefOne : func ( number ) : string = ( a : number ) : string = > 'x'
var RefTwo : func ( number ) : any = ( a : number ) : any = > 'x'
var Fx = ( a ) = > ( {k1 : 0 ,
k2 : 1 })
var Fy = ( a ) = > [0 ,
1 ]
2020-12-24 15:14:01 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-12-24 15:14:01 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var Ref = (a)=>a + 1" ], 'E1004:' )
v9 .CheckDefAndScriptFailure ( ["var Ref = (a)=> a + 1" ], 'E1004:' )
v9 .CheckDefAndScriptFailure ( ["var Ref = (a) =>a + 1" ],
2021-01-01 19:17:55 +01:00
'E1004: White space required before and after ''=>'' at " =>a + 1"' )
2020-12-25 15:24:23 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var Ref: func(number): number = (a: number): string => 'x'" ], 'E1012:' )
v9 .CheckDefAndScriptFailure ( ["var Ref: func(number): string = (a: number): string => 99" ], 'E1012:' )
2020-12-25 12:38:04 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["filter([1, 2], (k,v) => 1)" ], 'E1069:' , 1 )
2020-12-24 15:14:01 +01:00
# error is in first line of the lambda
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var L = (a) -> a + b" ], ['E1001:' , 'E121:' ], 1 )
2020-12-24 15:14:01 +01:00
2021-04-04 20:49:50 +02:00
assert_equal ( 'xxxyyy' , 'xxx' - > ( ( a , b ) = > a .. b ) ( 'yyy' ) )
2020-12-24 15:14:01 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ["var s = 'asdf'->((a) => a)('x')" ],
2021-04-04 20:49:50 +02:00
'E118: Too many arguments for function:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( ["var s = 'asdf'->((a) => a)('x', 'y')" ],
2021-04-04 20:49:50 +02:00
'E118: Too many arguments for function:' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ["echo 'asdf'->((a) => a)(x)" ], 'E1001:' , 1 )
2020-12-24 15:14:01 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ['var Fx = (a) => ({k1: 0' , ' k2: 1})' ], 'E722:' , 2 )
v9 .CheckDefAndScriptFailure ( ['var Fx = (a) => ({k1: 0,' , ' k2 1})' ], 'E720:' , 2 )
2020-12-24 15:14:01 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ['var Fx = (a) => [0' , ' 1]' ], 'E696:' , 2 )
2020-12-24 15:14:01 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_lambda_vim9script ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-12-31 21:28:47 +01:00
var v = 10 - > ( ( a ) = >
2020-06-27 18:06:45 +02:00
a
+ 2
2020-12-31 21:28:47 +01:00
) ( )
2020-06-27 18:06:45 +02:00
assert_equal ( 12 , v )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-18 22:32:03 +02:00
# nested lambda with line breaks
lines = < < trim END
2020-12-31 21:28:47 +01:00
search ( '"' , 'cW' , 0 , 0 , ( ) = >
2020-08-18 22:32:03 +02:00
synstack ( '.' , col ( '.' ) )
2021-12-25 21:43:28 +00:00
- > mapnew ( ( _ , v ) = > synIDattr ( v , 'name' ) ) - > len ( ) )
2020-08-18 22:32:03 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 18:06:45 +02:00
enddef
2022-02-12 19:52:25 +00:00
def Test_expr8funcref ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-11-12 20:16:39 +01:00
def RetNumber ( ) : number
return 123
enddef
var FuncRef = RetNumber
assert_equal ( 123 , FuncRef ( ) )
2020-08-27 21:33:10 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-04-07 21:58:16 +02:00
lines = < < trim END
vim9script
func g :GlobalFunc ( )
return 'global'
endfunc
2022-02-12 19:52:25 +00:00
func ScriptFunc ( )
2021-04-07 21:58:16 +02:00
return 'script'
endfunc
def Test ( )
var Ref = g :GlobalFunc
assert_equal ( 'global' , Ref ( ) )
2022-01-30 15:28:30 +00:00
Ref = g :GlobalFunc
2021-04-07 21:58:16 +02:00
assert_equal ( 'global' , Ref ( ) )
2022-02-12 19:52:25 +00:00
Ref = ScriptFunc
2021-04-07 21:58:16 +02:00
assert_equal ( 'script' , Ref ( ) )
Ref = ScriptFunc
assert_equal ( 'script' , Ref ( ) )
enddef
Test ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-08-27 21:33:10 +02:00
enddef
2020-11-19 18:53:18 +01:00
let g :test_space_dict = {'' : 'empty' , ' ' : 'space' }
let g :test_hash_dict = #{one : 1 , two : 2 }
2022-01-17 20:50:40 +00:00
def Test_expr8_dict ( )
2020-07-17 20:36:00 +02:00
# dictionary
2020-11-12 20:16:39 +01:00
var lines = < < trim END
assert_equal ( g :dict_empty , {})
assert_equal ( g :dict_empty , { })
2020-12-02 17:36:54 +01:00
assert_equal ( g :dict_one , {['one' ]: 1 })
2020-11-12 20:16:39 +01:00
var key = 'one'
var val = 1
2020-11-19 18:53:18 +01:00
assert_equal ( g :dict_one , {[key ]: val })
2020-11-12 20:16:39 +01:00
2020-11-19 18:53:18 +01:00
var numbers : dict < number > = {a : 1 , b : 2 , c : 3 }
2020-12-02 17:36:54 +01:00
numbers = {a : 1 }
numbers = {}
2020-11-12 20:16:39 +01:00
2020-11-19 18:53:18 +01:00
var strings : dict < string > = {a : 'a' , b : 'b' , c : 'c' }
2020-12-02 17:36:54 +01:00
strings = {a : 'x' }
strings = {}
var dash = {xx - x : 8 }
assert_equal ( {['xx-x' ]: 8 }, dash )
var dnr = {8 : 8 }
assert_equal ( {['8' ]: 8 }, dnr )
2020-11-12 20:16:39 +01:00
2020-11-19 18:53:18 +01:00
var mixed : dict < any > = {a : 'a' , b : 42 }
2020-12-02 17:36:54 +01:00
mixed = {a : 'x' }
mixed = {a : 234 }
mixed = {}
2020-11-12 20:16:39 +01:00
2020-12-02 17:36:54 +01:00
var dictlist : dict < list < string > > = {absent : [], present : ['hi' ]}
dictlist = {absent : ['hi' ], present : []}
dictlist = {absent : [], present : []}
2020-11-12 20:16:39 +01:00
2020-12-02 17:36:54 +01:00
var dictdict : dict < dict < string > > = {one : {a : 'text' }, two : {}}
dictdict = {one : {}, two : {a : 'text' }}
dictdict = {one : {}, two : {}}
2020-11-12 20:16:39 +01:00
2020-12-02 17:36:54 +01:00
assert_equal ( {['' ]: 0 }, {[matchstr ( 'string' , 'wont match' ) ]: 0 })
2020-11-19 18:53:18 +01:00
assert_equal ( g :test_space_dict , {['' ]: 'empty' , [' ' ]: 'space' })
assert_equal ( g :test_hash_dict , {one : 1 , two : 2 })
2020-12-04 19:12:14 +01:00
assert_equal ( {['a a' ]: 1 , ['b/c' ]: 2 }, {'a a' : 1 , "b/c" : 2 })
2020-12-31 13:31:23 +01:00
var d = {a : ( ) = > 3 , b : ( ) = > 7 }
assert_equal ( 3 , d .a ( ) )
assert_equal ( 7 , d .b ( ) )
2021-01-03 18:33:13 +01:00
var cd = { # comment
key : 'val' # comment
}
2021-02-03 17:41:24 +01:00
# different types used for the key
var dkeys = {['key' ]: 'string' ,
[12 ]: 'numberexpr' ,
34 : 'number' ,
[true ]: 'bool' }
assert_equal ( 'string' , dkeys ['key' ])
assert_equal ( 'numberexpr' , dkeys [12 ])
assert_equal ( 'number' , dkeys [34 ])
assert_equal ( 'bool' , dkeys [true ])
if has ( 'float' )
dkeys = {[1 .2 ]: 'floatexpr' , [3 .4 ]: 'float' }
assert_equal ( 'floatexpr' , dkeys [1 .2 ])
assert_equal ( 'float' , dkeys [3 .4 ])
endif
# automatic conversion from number to string
var n = 123
var dictnr = {[n ]: 1 }
2021-03-20 15:00:01 +01:00
# comment to start fold is OK
var x1 : number #{{ fold
var x2 = 9 #{{ fold
2020-11-12 20:16:39 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-09-19 14:12:34 +02:00
2020-12-02 17:36:54 +01:00
# legacy syntax doesn 't work
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = #{key: 8}" ], 'E1170:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = 'a' #{a: 1}" ], 'E1170:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = 'a' .. #{a: 1}" ], 'E1170:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = true ? #{a: 1}" ], 'E1170:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = {a:8}" ], 'E1069:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = {a : 8}" ], 'E1068:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = {a :8}" ], 'E1068:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = {a: 8 , b: 9}" ], 'E1068:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = {a: 1,b: 2}" ], 'E1069:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = {xxx}" ], 'E720:' , 1 )
v9 .CheckDefAndScriptFailure ( ["var x = {xxx: 1" , "var y = 2" ], 'E722:' , 2 )
v9 .CheckDefFailure ( ["var x = {xxx: 1," ], 'E723:' , 2 )
v9 .CheckScriptFailure ( ['vim9script' , "var x = {xxx: 1," ], 'E723:' , 2 )
v9 .CheckDefAndScriptFailure ( ["var x = {['a']: xxx}" ], ['E1001:' , 'E121:' ], 1 )
v9 .CheckDefAndScriptFailure ( ["var x = {a: 1, a: 2}" ], 'E721:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ["var x = g:anint.member" ], ['E715:' , 'E488:' ], 1 )
v9 .CheckDefExecAndScriptFailure ( ["var x = g:dict_empty.member" ], 'E716:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['var x: dict<number> = {a: 234, b: "1"}' ], 'E1012:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['var x: dict<number> = {a: "x", b: 134}' ], 'E1012:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['var x: dict<string> = {a: 234, b: "1"}' ], 'E1012:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['var x: dict<string> = {a: "x", b: 134}' ], 'E1012:' , 1 )
2020-10-05 19:23:59 +02:00
2021-02-03 17:41:24 +01:00
# invalid types for the key
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = {[[1, 2]]: 0}" ], ['E1105:' , 'E730:' ], 1 )
2021-02-03 17:41:24 +01:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( ['var x = ({' ], 'E723:' , 2 )
v9 .CheckScriptFailure ( ['vim9script' , 'var x = ({' ], 'E723:' , 2 )
v9 .CheckDefExecAndScriptFailure ( ['{}[getftype("file")]' ], 'E716: Key not present in Dictionary: ""' , 1 )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_dict_vim9script ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
var d = {
2020-12-02 17:36:54 +01:00
['one' ]:
2020-06-27 14:11:53 +02:00
1 ,
2020-12-02 17:36:54 +01:00
['two' ]: 2 ,
2020-06-27 14:11:53 +02:00
}
2020-12-02 17:36:54 +01:00
assert_equal ( {one : 1 , two : 2 }, d )
2020-10-11 21:34:41 +02:00
d = { # comment
2020-12-02 17:36:54 +01:00
['one' ]:
2020-10-11 21:34:41 +02:00
# comment
1 ,
# comment
# comment
2020-12-02 17:36:54 +01:00
['two' ]: 2 ,
2020-10-11 21:34:41 +02:00
}
2020-12-02 17:36:54 +01:00
assert_equal ( {one : 1 , two : 2 }, d )
2020-12-31 21:28:47 +01:00
var dd = {k : 123 - > len ( ) }
assert_equal ( 3 , dd .k )
2020-06-27 14:11:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 14:11:53 +02:00
2020-07-01 17:28:33 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var d = { ["one" ]: "one" , ["two" ]: "two" , }
assert_equal ( {one : 'one' , two : 'two' }, d )
2020-07-01 17:28:33 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-01 17:28:33 +02:00
2020-06-27 14:11:53 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var d = {one : 1 ,
2020-06-27 14:11:53 +02:00
two : 2 ,
}
2020-12-02 17:36:54 +01:00
assert_equal ( {one : 1 , two : 2 }, d )
2020-06-27 14:11:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 14:11:53 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var d = {one :1 , two : 2 }
2020-06-27 14:11:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1069:' , 1 )
2020-06-27 14:11:53 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var d = {one : 1 , two : 2 }
2020-06-27 14:11:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1069:' , 1 )
2020-08-12 18:01:53 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var d = {one : 1 }
2020-08-12 18:01:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1068:' , 1 )
2020-08-12 18:01:53 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var d = {one :1 }
2020-08-12 18:01:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1069:' , 1 )
2020-08-12 18:34:28 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var d = {one : 1 , two : 2 }
2020-08-12 18:34:28 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1068:' , 1 )
2020-08-14 21:27:37 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var l : dict < number > = {a : 234 , b : 'x' }
2020-08-14 21:27:37 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-14 21:27:37 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var l : dict < number > = {a : 'x' , b : 234 }
2020-08-14 21:27:37 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-14 21:27:37 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var l : dict < string > = {a : 'x' , b : 234 }
2020-08-14 21:27:37 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012:' , 1 )
2021-04-04 20:49:50 +02:00
2020-08-14 21:27:37 +02:00
lines = < < trim END
2020-12-02 17:36:54 +01:00
var l : dict < string > = {a : 234 , b : 'x' }
2020-08-14 21:27:37 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1012:' , 1 )
2020-11-04 12:00:53 +01:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
var d = {['a' ]: 234 , ['b' : 'x' }
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1139:' , 1 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
def Func ( )
var d = {['a' ]: 234 , ['b' : 'x' }
enddef
defcompile
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E1139:' , 0 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
var d = {'a' :
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E723:' , 2 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E15:' , 2 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
def Func ( )
var d = {'a' :
enddef
defcompile
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E723:' , 0 )
2020-12-06 14:37:08 +01:00
2020-11-04 12:00:53 +01:00
lines = < < trim END
def Failing ( )
job_stop ( )
enddef
2020-12-02 17:36:54 +01:00
var dict = {name : Failing }
2020-11-04 12:00:53 +01:00
END
2020-11-07 13:09:18 +01:00
if has ( 'channel' )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E119:' , 0 )
2020-11-07 13:09:18 +01:00
else
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E117:' , 0 )
2020-11-07 13:09:18 +01:00
endif
2021-07-11 20:59:00 +02:00
lines = < < trim END
vim9script
var x = 99
assert_equal ( {x : 99 }, s :)
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-06-27 14:11:53 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_dict_in_block ( )
2021-12-15 15:41:44 +00:00
var lines = < < trim END
vim9script
command MyCommand {
echo {
k : 0 , }
}
MyCommand
2021-12-17 12:45:22 +00:00
command YourCommand {
g :global = {
key : 'value' }
}
YourCommand
assert_equal ( {key : 'value' }, g :global )
unlet g :global
2021-12-15 15:41:44 +00:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-12-15 15:41:44 +00:00
delcommand MyCommand
2021-12-17 12:45:22 +00:00
delcommand YourCommand
2021-12-15 15:41:44 +00:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_call_2bool ( )
2021-06-04 21:00:32 +02:00
var lines = < < trim END
vim9script
def BrokenCall ( nr : number , mode : bool , use : string ) : void
assert_equal ( 3 , nr )
assert_equal ( false , mode )
assert_equal ( 'ab' , use )
enddef
def TestBrokenCall ( ) : void
BrokenCall ( 3 , 0 , 'ab' )
enddef
TestBrokenCall ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-06-04 21:00:32 +02:00
enddef
2020-07-05 16:51:26 +02:00
let g :oneString = 'one'
2020-03-29 21:38:15 +02:00
def Test_expr_member ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
assert_equal ( 1 , g :dict_one .one )
var d : dict < number > = g :dict_one
assert_equal ( 1 , d ['one' ])
assert_equal ( 1 , d [
'one'
])
assert_equal ( 1 , d
.one )
d = {1 : 1 , _ : 2 }
assert_equal ( 1 , d
.1 )
assert_equal ( 2 , d
._ )
# getting the one member should clear the dict after getting the item
assert_equal ( 'one' , {one : 'one' }.one )
assert_equal ( 'one' , {one : 'one' }[g :oneString ])
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = g:dict_one.#$!" ], ['E1002:' , 'E15:' ], 1 )
v9 .CheckDefExecAndScriptFailure ( ["var d: dict<any>" , "echo d['a']" ], 'E716:' , 2 )
v9 .CheckDefExecAndScriptFailure ( ["var d: dict<number>" , "d = g:list_empty" ], 'E1012: Type mismatch; expected dict<number> but got list<unknown>' , 2 )
2020-03-29 21:38:15 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_any_index_slice ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-08-16 17:33:35 +02:00
# getting the one member should clear the list only after getting the item
assert_equal ( 'bbb' , ['aaa' , 'bbb' , 'ccc' ][1 ])
# string is permissive , index out of range accepted
g :teststring = 'abcdef'
assert_equal ( 'b' , g :teststring [1 ])
2021-01-09 13:20:37 +01:00
assert_equal ( 'f' , g :teststring [-1 ])
2020-08-16 17:33:35 +02:00
assert_equal ( '' , g :teststring [99 ])
2020-12-30 20:39:21 +01:00
assert_equal ( 'b' , g :teststring [1 : 1 ])
assert_equal ( 'bcdef' , g :teststring [1 :])
assert_equal ( 'abcd' , g :teststring [: 3 ])
assert_equal ( 'cdef' , g :teststring [-4 :])
assert_equal ( 'abcdef' , g :teststring [-9 :])
assert_equal ( 'abcd' , g :teststring [: -3 ])
assert_equal ( '' , g :teststring [: -9 ])
2020-08-16 17:33:35 +02:00
2021-03-14 18:40:19 +01:00
# composing characters are included
g :teststring = 'àéû'
assert_equal ( 'à' , g :teststring [0 ])
assert_equal ( 'é' , g :teststring [1 ])
assert_equal ( 'û' , g :teststring [2 ])
assert_equal ( '' , g :teststring [3 ])
assert_equal ( '' , g :teststring [4 ])
assert_equal ( 'û' , g :teststring [-1 ])
assert_equal ( 'é' , g :teststring [-2 ])
assert_equal ( 'à' , g :teststring [-3 ])
assert_equal ( '' , g :teststring [-4 ])
assert_equal ( '' , g :teststring [-5 ])
assert_equal ( 'à' , g :teststring [0 : 0 ])
assert_equal ( 'é' , g :teststring [1 : 1 ])
assert_equal ( 'àé' , g :teststring [0 : 1 ])
assert_equal ( 'àéû' , g :teststring [0 : -1 ])
assert_equal ( 'àé' , g :teststring [0 : -2 ])
assert_equal ( 'à' , g :teststring [0 : -3 ])
assert_equal ( '' , g :teststring [0 : -4 ])
assert_equal ( '' , g :teststring [0 : -5 ])
assert_equal ( 'àéû' , g :teststring [ : ])
assert_equal ( 'àéû' , g :teststring [0 : ])
assert_equal ( 'éû' , g :teststring [1 : ])
assert_equal ( 'û' , g :teststring [2 : ])
assert_equal ( '' , g :teststring [3 : ])
assert_equal ( '' , g :teststring [4 : ])
2020-08-16 17:33:35 +02:00
# blob index cannot be out of range
g :testblob = 0 z01 ab
assert_equal ( 0 x01 , g :testblob [0 ])
assert_equal ( 0 xab, g :testblob [1 ])
assert_equal ( 0 xab, g :testblob [-1 ])
assert_equal ( 0 x01 , g :testblob [-2 ])
# blob slice accepts out of range
2020-12-30 20:39:21 +01:00
assert_equal ( 0 z01 ab, g :testblob [0 : 1 ])
assert_equal ( 0 z01 , g :testblob [0 : 0 ])
assert_equal ( 0 z01 , g :testblob [-2 : -2 ])
assert_equal ( 0 zab, g :testblob [1 : 1 ])
assert_equal ( 0 zab, g :testblob [-1 : -1 ])
assert_equal ( 0 z, g :testblob [2 : 2 ])
assert_equal ( 0 z, g :testblob [0 : -3 ])
2020-08-16 17:33:35 +02:00
# list index cannot be out of range
g :testlist = [0 , 1 , 2 , 3 ]
assert_equal ( 0 , g :testlist [0 ])
assert_equal ( 1 , g :testlist [1 ])
assert_equal ( 3 , g :testlist [3 ])
assert_equal ( 3 , g :testlist [-1 ])
assert_equal ( 0 , g :testlist [-4 ])
assert_equal ( 1 , g :testlist [g :theone ])
# list slice accepts out of range
2020-12-30 20:39:21 +01:00
assert_equal ( [0 ], g :testlist [0 : 0 ])
assert_equal ( [3 ], g :testlist [3 : 3 ])
assert_equal ( [0 , 1 ], g :testlist [0 : 1 ])
assert_equal ( [0 , 1 , 2 , 3 ], g :testlist [0 : 3 ])
assert_equal ( [0 , 1 , 2 , 3 ], g :testlist [0 : 9 ])
assert_equal ( [], g :testlist [-1 : 1 ])
assert_equal ( [1 ], g :testlist [-3 : 1 ])
assert_equal ( [0 , 1 ], g :testlist [-4 : 1 ])
assert_equal ( [0 , 1 ], g :testlist [-9 : 1 ])
assert_equal ( [1 , 2 , 3 ], g :testlist [1 : -1 ])
assert_equal ( [1 ], g :testlist [1 : -3 ])
assert_equal ( [], g :testlist [1 : -4 ])
assert_equal ( [], g :testlist [1 : -9 ])
2020-08-16 17:33:35 +02:00
2020-12-02 17:36:54 +01:00
g :testdict = {a : 1 , b : 2 }
2020-08-16 17:33:35 +02:00
assert_equal ( 1 , g :testdict ['a' ])
assert_equal ( 2 , g :testdict ['b' ])
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-16 17:33:35 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ['echo g:testblob[2]' ], 'E979:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['echo g:testblob[-3]' ], 'E979:' , 1 )
2020-08-16 17:33:35 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ['echo g:testlist[4]' ], 'E684: list index out of range: 4' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['echo g:testlist[-5]' ], 'E684:' , 1 )
2020-08-16 17:33:35 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( ['echo g:testdict["a" : "b"]' ], 'E719:' , 1 )
v9 .CheckDefExecAndScriptFailure ( ['echo g:testdict[1]' ], 'E716:' , 1 )
2020-08-16 17:33:35 +02:00
unlet g :teststring
unlet g :testblob
unlet g :testlist
2020-07-05 16:42:13 +02:00
enddef
2020-07-03 21:09:52 +02:00
def Test_expr_member_vim9script ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-12-02 17:36:54 +01:00
var d = {one :
2020-07-03 21:09:52 +02:00
'one' ,
2020-07-27 21:43:28 +02:00
two : 'two' ,
1 : 1 ,
_ : 2 }
2020-07-03 21:09:52 +02:00
assert_equal ( 'one' , d .one )
assert_equal ( 'one' , d
.one )
2020-07-27 21:43:28 +02:00
assert_equal ( 1 , d
.1 )
assert_equal ( 2 , d
._ )
2020-07-03 21:09:52 +02:00
assert_equal ( 'one' , d [
'one'
])
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-03 21:09:52 +02:00
lines = < < trim END
2020-09-27 17:57:43 +02:00
var l = [1 ,
2020-07-03 21:09:52 +02:00
2 ,
3 , 4
]
assert_equal ( 2 , l [
1
])
assert_equal ( [2 , 3 ], l [1 : 2 ])
assert_equal ( [1 , 2 , 3 ], l [
:
2
])
assert_equal ( [3 , 4 ], l [
2
:
])
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-03 21:09:52 +02:00
enddef
2021-01-05 17:50:28 +01:00
def SetSomeVar ( )
b :someVar = &fdm
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_option ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
# option
set ts = 11
assert_equal ( 11 , &ts )
&ts = 9
assert_equal ( 9 , &ts )
set ts = 8
set grepprg = some \ text
assert_equal ( 'some text' , &grepprg )
&grepprg = test_null_string ( )
assert_equal ( '' , &grepprg )
set grepprg &
# check matching type
var bval : bool = &tgc
var nval : number = &ts
var sval : string = &path
# check v_lock is cleared ( requires using valgrind , doesn 't always show )
2022-01-29 21:45:34 +00:00
g :SetSomeVar ( )
2021-04-04 20:49:50 +02:00
b :someVar = 0
unlet b :someVar
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_environment ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
# environment variable
assert_equal ( 'testvar' , $TESTVAR )
assert_equal ( '' , $ASDF_ASD_XXX )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-03-29 18:40:30 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = $$$" ], ['E1002:' , 'E15:' ], 1 )
v9 .CheckDefAndScriptFailure ( ["$" ], ['E1002:' , 'E15:' ], 1 )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_register ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
@a = 'register a'
assert_equal ( 'register a' , @a )
2020-08-02 17:33:26 +02:00
2021-04-04 20:49:50 +02:00
var fname = expand ( '%' )
assert_equal ( fname , @%)
2020-08-02 17:33:26 +02:00
2021-04-04 20:49:50 +02:00
feedkeys ( ":echo 'some'\<CR>" , "xt" )
assert_equal ( "echo 'some'" , @:)
2020-08-02 17:33:26 +02:00
2021-04-04 20:49:50 +02:00
normal axyz
assert_equal ( "xyz" , @.)
2020-08-02 18:58:54 +02:00
2021-04-04 20:49:50 +02:00
@/ = 'slash'
assert_equal ( 'slash' , @/)
2020-08-02 18:58:54 +02:00
2021-04-04 20:49:50 +02:00
@= = 'equal'
assert_equal ( 'equal' , @= )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["@. = 'yes'" ], ['E354:' , 'E488:' ], 1 )
2020-01-26 15:56:19 +01:00
enddef
2021-04-05 13:36:34 +02:00
" This is slow when run under valgrind.
2022-01-17 20:50:40 +00:00
def Test_expr8_namespace ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
g :some_var = 'some'
assert_equal ( 'some' , get ( g :, 'some_var' ) )
assert_equal ( 'some' , get ( g :, 'some_var' , 'xxx' ) )
assert_equal ( 'xxx' , get ( g :, 'no_var' , 'xxx' ) )
unlet g :some_var
b :some_var = 'some'
assert_equal ( 'some' , get ( b :, 'some_var' ) )
assert_equal ( 'some' , get ( b :, 'some_var' , 'xxx' ) )
assert_equal ( 'xxx' , get ( b :, 'no_var' , 'xxx' ) )
unlet b :some_var
w :some_var = 'some'
assert_equal ( 'some' , get ( w :, 'some_var' ) )
assert_equal ( 'some' , get ( w :, 'some_var' , 'xxx' ) )
assert_equal ( 'xxx' , get ( w :, 'no_var' , 'xxx' ) )
unlet w :some_var
t :some_var = 'some'
assert_equal ( 'some' , get ( t :, 'some_var' ) )
assert_equal ( 'some' , get ( t :, 'some_var' , 'xxx' ) )
assert_equal ( 'xxx' , get ( t :, 'no_var' , 'xxx' ) )
unlet t :some_var
2021-08-07 17:20:16 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-08-07 17:20:16 +02:00
enddef
2021-04-04 20:49:50 +02:00
2022-01-17 20:50:40 +00:00
def Test_expr8_namespace_loop_def ( )
2021-08-07 17:20:16 +02:00
var lines = < < trim END
2021-04-04 20:49:50 +02:00
# check using g : in a for loop more than DO_NOT_FREE_CNT times
2021-08-07 17:20:16 +02:00
var exists = 0
var exists_not = 0
2021-04-04 20:49:50 +02:00
for i in range ( 100000 )
if has_key ( g :, 'does-not-exist' )
2021-08-07 17:20:16 +02:00
exists + = 1
else
exists_not + = 1
2021-04-04 20:49:50 +02:00
endif
endfor
2021-08-07 17:20:16 +02:00
assert_equal ( 0 , exists )
assert_equal ( 100000 , exists_not )
2021-04-04 20:49:50 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefSuccess ( lines )
2021-08-07 17:20:16 +02:00
enddef
" NOTE: this is known to be slow. To skip use:
2022-01-17 20:50:40 +00:00
" :let $TEST_SKIP_PAT = 'Test_expr8_namespace_loop_script'
def Test_expr8_namespace_loop_script ( )
2021-08-07 17:20:16 +02:00
var lines = < < trim END
vim9script
# check using g : in a for loop more than DO_NOT_FREE_CNT times
var exists = 0
var exists_not = 0
for i in range ( 100000 )
if has_key ( g :, 'does-not-exist' )
exists + = 1
else
exists_not + = 1
endif
endfor
assert_equal ( 0 , exists )
assert_equal ( 100000 , exists_not )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2020-07-19 19:47:35 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_parens ( )
2020-07-17 20:36:00 +02:00
# ( expr )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2021-01-14 20:35:49 +01:00
assert_equal ( 4 , ( 6 * 4 ) / 6 )
assert_equal ( 0 , 6 * ( 4 / 6 ) )
assert_equal ( 6 , + 6 )
assert_equal ( -6 , -6 )
assert_equal ( false , ! -3 )
assert_equal ( true , ! + 0 )
assert_equal ( 7 , 5 + (
2 ) )
assert_equal ( 7 , 5 + (
2
) )
assert_equal ( 7 , 5 + ( # comment
2 ) )
assert_equal ( 7 , 5 + ( # comment
# comment
2 ) )
2020-09-27 17:57:43 +02:00
var s = (
2020-06-27 20:46:29 +02:00
'one'
..
'two'
)
assert_equal ( 'onetwo' , s )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-27 20:46:29 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_negate_add ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
assert_equal ( -99 , -99 )
assert_equal ( -99 , - 99 )
assert_equal ( 99 , + 99 )
2020-11-18 17:39:05 +01:00
2021-04-04 20:49:50 +02:00
var nr = 88
assert_equal ( -88 , - nr )
assert_equal ( -88 , - nr )
assert_equal ( 88 , + nr )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-01-05 22:08:20 +01:00
2021-04-04 20:49:50 +02:00
lines = < < trim END
2021-01-05 22:08:20 +01:00
var n = 12
echo + + n
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' )
2021-01-05 22:08:20 +01:00
lines = < < trim END
var n = 12
echo - - n
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' )
2021-01-05 22:08:20 +01:00
lines = < < trim END
var n = 12
echo + - n
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' )
2021-01-05 22:08:20 +01:00
lines = < < trim END
var n = 12
echo - + n
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' )
2021-01-05 22:08:20 +01:00
lines = < < trim END
var n = 12
echo - - n
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' )
2021-01-05 22:08:20 +01:00
lines = < < trim END
var n = 12
echo + + n
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E15:' )
2020-03-29 21:38:15 +02:00
enddef
2021-05-17 00:01:42 +02:00
def LegacyReturn ( ) : string
legacy return #{key : 'ok' }.key
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_legacy_script ( )
2021-04-07 21:21:13 +02:00
var lines = < < trim END
let s :legacy = 'legacy'
def GetLocal ( ) : string
return legacy
enddef
def GetLocalPrefix ( ) : string
return s :legacy
enddef
call assert_equal ( 'legacy' , GetLocal ( ) )
call assert_equal ( 'legacy' , GetLocalPrefix ( ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2021-05-17 00:01:42 +02:00
2022-01-29 21:45:34 +00:00
assert_equal ( 'ok' , g :LegacyReturn ( ) )
2021-05-17 00:01:42 +02:00
lines = < < trim END
vim9script
def GetNumber ( ) : number
legacy return range ( 3 ) - > map ( 'v:val + 1' )
enddef
echo GetNumber ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1012: Type mismatch; expected number but got list<number>' )
2021-04-07 21:21:13 +02:00
enddef
2020-04-13 17:21:00 +02:00
def Echo ( arg : any ) : string
2020-03-29 21:38:15 +02:00
return arg
enddef
2020-08-05 15:43:44 +02:00
def s :Echo4Arg ( arg : any ) : string
2020-03-29 21:38:15 +02:00
return arg
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_call ( )
2020-11-12 20:16:39 +01:00
var lines = < < trim END
2022-01-29 21:45:34 +00:00
assert_equal ( 'yes' , 'yes' - > g :Echo ( ) )
2020-11-12 20:16:39 +01:00
assert_equal ( true , ! range ( 5 ) - > empty ( ) )
2021-01-05 22:08:20 +01:00
assert_equal ( [0 , 1 , 2 ], 3 - > range ( ) )
2020-11-12 20:16:39 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-11-12 20:16:39 +01:00
2020-07-23 15:38:03 +02:00
assert_equal ( 'yes' , 'yes'
2020-11-12 20:16:39 +01:00
- > s :Echo4Arg ( ) )
2020-03-29 21:38:15 +02:00
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var x = 'yes'->g:Echo" ], 'E107:' , 1 )
v9 .CheckDefAndScriptFailure ( [
2021-04-04 20:49:50 +02:00
"var x = substitute ('x', 'x', 'x', 'x')"
2021-12-19 18:33:23 +00:00
], ['E1001:' , 'E121:' ], 1 )
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( ["var Ref = function('len' [1, 2])" ], ['E1123:' , 'E116:' ], 1 )
enddef
2022-01-30 15:28:30 +00:00
def g :ExistingGlobal ( ) : string
2022-01-29 21:45:34 +00:00
return 'existing'
enddef
def Test_expr8_call_global ( )
2022-01-30 15:28:30 +00:00
assert_equal ( 'existing' , g :ExistingGlobal ( ) )
2022-01-29 21:45:34 +00:00
def g :DefinedLater ( ) : string
return 'later'
enddef
assert_equal ( 'later' , g :DefinedLater ( ) )
var lines = < < trim END
echo ExistingGlobal ( )
END
v9 .CheckDefAndScriptFailure ( lines , 'E117: Unknown function: ExistingGlobal' )
enddef
2020-08-12 15:21:22 +02:00
2022-01-29 21:45:34 +00:00
def Test_expr8_call_autoload ( )
2020-09-27 17:57:43 +02:00
var auto_lines = < < trim END
2020-08-12 15:21:22 +02:00
def g :some #func ( ) : string
return 'found'
enddef
END
mkdir ( 'Xruntime/autoload' , 'p' )
writefile ( auto_lines , 'Xruntime/autoload/some.vim' )
2020-09-27 17:57:43 +02:00
var save_rtp = &rtp
2020-08-12 15:21:22 +02:00
&rtp = getcwd ( ) .. '/Xruntime,' .. &rtp
assert_equal ( 'found' , g :some #func ( ) )
assert_equal ( 'found' , some #func ( ) )
&rtp = save_rtp
delete ( 'Xruntime' , 'rf' )
2020-03-29 21:38:15 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_method_call ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
new
setline ( 1 , ['first' , 'last' ])
'second' - > append ( 1 )
"third"->append(2)
assert_equal ( ['first' , 'second' , 'third' , 'last' ], getline ( 1 , '$' ) )
bwipe !
2020-12-25 21:56:57 +01:00
2021-04-04 20:49:50 +02:00
var bufnr = bufnr ( )
var loclist = [{bufnr : bufnr , lnum : 42 , col : 17 , text : 'wrong' }]
loclist - > setloclist ( 0 )
assert_equal ( [{bufnr : bufnr ,
lnum : 42 ,
2021-06-19 20:45:20 +02:00
end_lnum : 0 ,
2021-04-04 20:49:50 +02:00
col : 17 ,
2021-06-19 20:45:20 +02:00
end_col : 0 ,
2021-04-04 20:49:50 +02:00
text : 'wrong' ,
pattern : '' ,
valid : 1 ,
vcol : 0 ,
nr : 0 ,
type : '' ,
module : '' }
], getloclist ( 0 ) )
var result : bool = get ( {n : 0 }, 'n' , 0 )
assert_equal ( false , result )
assert_equal ( '+string+' , 'string' - > ( ( s ) = > '+' .. s .. '+' ) ( ) )
assert_equal ( '-text-' , 'text' - > ( ( s , c ) = > c .. s .. c ) ( '-' ) )
var Join = ( l ) = > join ( l , 'x' )
assert_equal ( 'axb' , ['a' , 'b' ]- > ( Join ) ( ) )
2021-06-08 20:46:45 +02:00
var sorted = [3 , 1 , 2 ]
- > sort ( )
assert_equal ( [1 , 2 , 3 ], sorted )
2022-01-16 19:38:07 +00:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2022-01-16 18:06:21 +00:00
2022-01-16 19:38:07 +00:00
lines = < < trim END
2022-01-16 18:06:21 +00:00
def SetNumber ( n : number )
g :number = n
enddef
const Setit = SetNumber
len ( 'text' ) - > Setit ( )
assert_equal ( 4 , g :number )
2022-01-16 19:38:07 +00:00
const SetFuncref = funcref ( SetNumber )
len ( 'longer' ) - > SetFuncref ( )
assert_equal ( 6 , g :number )
const SetList = [SetNumber , SetFuncref ]
len ( 'xx' ) - > SetList [0 ]( )
assert_equal ( 2 , g :number )
len ( 'xxx' ) - > SetList [1 ]( )
assert_equal ( 3 , g :number )
const SetDict = {key : SetNumber }
len ( 'xxxx' ) - > SetDict ['key' ]( )
assert_equal ( 4 , g :number )
len ( 'xxxxx' ) - > SetDict .key ( )
assert_equal ( 5 , g :number )
2022-01-16 18:06:21 +00:00
unlet g :number
2021-04-04 20:49:50 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-06-15 22:13:27 +02:00
lines = < < trim END
def RetVoid ( )
enddef
RetVoid ( ) - > byteidx ( 3 )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecFailure ( lines , 'E1013:' )
2020-12-25 21:56:57 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_method_call_linebreak ( )
2022-01-10 18:50:52 +00:00
# this was giving an error when skipping over the expression
var lines = < < trim END
vim9script
def Test ( )
var a : dict < any > = {b : {}}
a .b - > extend ( {f1 : 1 ,
f2 : 2 })
echo a
enddef
defcompile
assert_equal ( '' , v :errmsg )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2022-01-10 18:50:52 +00:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_method_call_import ( )
var lines = < < trim END
vim9script
export def Square ( items : list < number > ) : list < number >
return map ( items , ( _ , i ) = > i * i )
enddef
END
call writefile ( lines , 'Xsquare.vim' )
lines = < < trim END
vim9script
import './Xsquare.vim'
def Test ( ) : list < number >
return range ( 5 )
- > Xsquare .Square ( )
- > map ( ( _ , i ) = > i * 10 )
enddef
assert_equal ( [0 , 10 , 40 , 90 , 160 ], Test ( ) )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptSuccess ( lines )
2022-01-17 20:50:40 +00:00
2022-01-18 10:37:29 +00:00
lines = < < trim END
vim9script
import './Xsquare.vim'
echo range ( 5 ) - > Xsquare .NoSuchFunc ( )
END
2022-01-29 21:45:34 +00:00
v9 .CheckScriptFailure ( lines , 'E1048: Item not found in script: NoSuchFunc' )
2022-01-18 10:37:29 +00:00
2022-01-17 20:50:40 +00:00
delete ( 'Xsquare.vim' )
enddef
2020-03-29 21:38:15 +02:00
2022-01-17 20:50:40 +00:00
def Test_expr8_not ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-08-10 21:57:54 +02:00
assert_equal ( true , ! '' )
assert_equal ( true , ! [])
assert_equal ( false , ! 'asdf' )
assert_equal ( false , ! [2 ])
assert_equal ( true , ! ! 'asdf' )
assert_equal ( true , ! ! [2 ])
2020-10-15 21:54:56 +02:00
assert_equal ( true , ! false )
assert_equal ( true , ! ! true )
assert_equal ( true , ! ! true )
assert_equal ( true , ! ! ! false )
assert_equal ( true , ! ! ! false )
g :true = true
g :false = false
assert_equal ( true , ! g :false )
assert_equal ( true , ! ! g :true )
assert_equal ( true , ! ! g :true )
assert_equal ( true , ! ! ! g :false )
assert_equal ( true , ! ! ! g :false )
unlet g :true
unlet g :false
2020-08-10 21:57:54 +02:00
assert_equal ( true , ! test_null_partial ( ) )
2020-12-31 21:28:47 +01:00
assert_equal ( false , ! ( ) = > 'yes' )
2020-08-10 21:57:54 +02:00
assert_equal ( true , ! test_null_dict ( ) )
assert_equal ( true , ! {})
2020-12-02 17:36:54 +01:00
assert_equal ( false , ! {yes : 'no' })
2020-08-10 21:57:54 +02:00
if has ( 'channel' )
assert_equal ( true , ! test_null_job ( ) )
assert_equal ( true , ! test_null_channel ( ) )
endif
assert_equal ( true , ! test_null_blob ( ) )
assert_equal ( true , ! 0 z)
assert_equal ( false , ! 0 z01 )
assert_equal ( true , ! test_void ( ) )
assert_equal ( true , ! test_unknown ( ) )
2020-08-10 23:09:37 +02:00
assert_equal ( false , ! [1 , 2 , 3 ]- > reverse ( ) )
assert_equal ( true , ! []- > reverse ( ) )
2020-08-10 21:57:54 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2021-08-15 20:36:28 +02:00
let g :anumber = 42
2022-01-17 20:50:40 +00:00
def Test_expr8_negate ( )
2021-08-15 20:36:28 +02:00
var lines = < < trim END
var nr = 1
assert_equal ( -1 , - nr )
assert_equal ( -42 , - g :anumber )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-08-15 20:36:28 +02:00
enddef
2022-01-17 20:50:40 +00:00
func Test_expr8_fails ( )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefFailure ( ["var x = (12" ], "E1097:" , 3 )
call v9 .CheckScriptFailure ( ['vim9script' , "var x = (12" ], 'E110:' , 2 )
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = -'xx'" ], "E1030:" , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = +'xx'" ], "E1030:" , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = -0z12" ], "E974:" , 1 )
call v9 .CheckDefExecAndScriptFailure ( ["var x = -[8]" ], ["E1012:" , 'E745:' ], 1 )
call v9 .CheckDefExecAndScriptFailure ( ["var x = -{a: 1}" ], ["E1012:" , 'E728:' ], 1 )
2020-01-26 15:56:19 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = @" ], "E1002:" , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = @<" ], "E354:" , 1 )
2020-01-28 22:46:22 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefFailure ( ["var x = [1, 2" ], "E697:" , 2 )
call v9 .CheckScriptFailure ( ['vim9script' , "var x = [1, 2" ], 'E696:' , 2 )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = [notfound]" ], ["E1001:" , 'E121:' ], 1 )
2020-03-28 21:38:06 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var X = () => 123)" ], 'E488:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = 123->((x) => x + 5)" ], "E107:" , 1 )
2020-03-28 21:38:06 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = ¬exist" ], 'E113:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["&grepprg = [343]" ], ['E1012:' , 'E730:' ], 1 )
2020-02-19 20:23:11 +01:00
2022-02-12 19:52:25 +00:00
call v9 .CheckDefExecAndScriptFailure ( ["echo s:doesnt_exist" ], ['E121:' , 'E1268:' ], 1 )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefExecAndScriptFailure ( ["echo g:doesnt_exist" ], 'E121:' , 1 )
2020-02-20 23:08:34 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["echo a:somevar" ], ['E1075:' , 'E121:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["echo l:somevar" ], ['E1075:' , 'E121:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["echo x:somevar" ], ['E1075:' , 'E121:' ], 1 )
2020-03-28 19:41:33 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefExecAndScriptFailure ( ["var x = +g:astring" ], ['E1012:' , 'E1030:' ], 1 )
call v9 .CheckDefExecAndScriptFailure ( ["var x = +g:ablob" ], ['E1012:' , 'E974:' ], 1 )
call v9 .CheckDefExecAndScriptFailure ( ["var x = +g:alist" ], ['E1012:' , 'E745:' ], 1 )
call v9 .CheckDefExecAndScriptFailure ( ["var x = +g:adict" ], ['E1012:' , 'E728:' ], 1 )
2020-02-29 23:23:47 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = ''" , "var y = x.memb" ], ['E1229: Expected dictionary for using key "memb", but got string' , 'E488:' ], 2 )
2020-03-28 19:41:33 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["'yes'->" , "Echo()" ], ['E488: Trailing characters: ->' , 'E260: Missing name after ->' ], 1 )
2020-07-23 15:38:03 +02:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefExecFailure ( ["[1, 2->len()" ], 'E697:' , 2 )
call v9 .CheckScriptFailure ( ['vim9script' , "[1, 2->len()" ], 'E696:' , 2 )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefFailure ( ["{a: 1->len()" ], 'E723:' , 2 )
call v9 .CheckScriptFailure ( ['vim9script' , "{a: 1->len()" ], 'E722:' , 2 )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefExecFailure ( ["{['a']: 1->len()" ], 'E723:' , 2 )
call v9 .CheckScriptFailure ( ['vim9script' , "{['a']: 1->len()" ], 'E722:' , 2 )
2020-01-26 15:56:19 +01:00
endfunc
let g :Funcrefs = [function ( 'add' ) ]
func CallMe ( arg )
return a :arg
endfunc
2020-02-19 12:40:39 +01:00
func CallMe2 ( one , two )
return a :one .. a :two
endfunc
2022-01-17 20:50:40 +00:00
def Test_expr8_trailing ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
# user function call
assert_equal ( 123 , g :CallMe ( 123 ) )
assert_equal ( 123 , g :CallMe ( 123 ) )
assert_equal ( 123 , g :CallMe ( 123 ) )
assert_equal ( 'yesno' , g :CallMe2 ( 'yes' , 'no' ) )
assert_equal ( 'yesno' , g :CallMe2 ( 'yes' , 'no' ) )
assert_equal ( 'nothing' , g :CallMe ( 'nothing' ) )
# partial call
var Part = function ( 'g:CallMe' )
assert_equal ( 'yes' , Part ( 'yes' ) )
# funcref call , using list index
var l = []
g :Funcrefs [0 ]( l , 2 )
assert_equal ( [2 ], l )
# method call
l = [2 , 5 , 6 ]
l - > map ( ( k , v ) = > k + v )
assert_equal ( [2 , 6 , 8 ], l )
# lambda method call
l = [2 , 5 ]
l - > ( ( ll ) = > add ( ll , 8 ) ) ( )
assert_equal ( [2 , 5 , 8 ], l )
# dict member
var d = {key : 123 }
assert_equal ( 123 , d .key )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-01-26 15:56:19 +01:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_string_subscript ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
var text = 'abcdef'
2021-01-09 13:20:37 +01:00
assert_equal ( 'f' , text [-1 ])
2020-08-15 18:39:05 +02:00
assert_equal ( 'a' , text [0 ])
assert_equal ( 'e' , text [4 ])
assert_equal ( 'f' , text [5 ])
assert_equal ( '' , text [6 ])
2021-01-09 13:20:37 +01:00
text = 'ábçdë'
assert_equal ( 'ë' , text [-1 ])
assert_equal ( 'd' , text [-2 ])
assert_equal ( 'ç' , text [-3 ])
assert_equal ( 'b' , text [-4 ])
assert_equal ( 'á' , text [-5 ])
assert_equal ( '' , text [-6 ])
2020-08-15 18:39:05 +02:00
text = 'ábçdëf'
assert_equal ( '' , text [-999 ])
2021-01-09 13:20:37 +01:00
assert_equal ( 'f' , text [-1 ])
2020-08-15 18:39:05 +02:00
assert_equal ( 'á' , text [0 ])
assert_equal ( 'b' , text [1 ])
assert_equal ( 'ç' , text [2 ])
assert_equal ( 'd' , text [3 ])
assert_equal ( 'ë' , text [4 ])
assert_equal ( 'f' , text [5 ])
assert_equal ( '' , text [6 ])
assert_equal ( '' , text [999 ])
2020-08-15 21:10:16 +02:00
2020-12-30 20:39:21 +01:00
assert_equal ( 'ábçdëf' , text [0 : -1 ])
assert_equal ( 'ábçdëf' , text [0 : -1 ])
assert_equal ( 'ábçdëf' , text [0 : -1 ])
2020-08-15 21:10:16 +02:00
assert_equal ( 'ábçdëf' , text [0 : -1 ])
assert_equal ( 'ábçdëf' , text [0
2020-12-30 20:39:21 +01:00
: -1 ])
assert_equal ( 'ábçdëf' , text [0 :
2020-08-15 21:10:16 +02:00
-1 ])
assert_equal ( 'ábçdëf' , text [0 : -1
])
2020-12-30 20:39:21 +01:00
assert_equal ( 'bçdëf' , text [1 : -1 ])
assert_equal ( 'çdëf' , text [2 : -1 ])
assert_equal ( 'dëf' , text [3 : -1 ])
assert_equal ( 'ëf' , text [4 : -1 ])
assert_equal ( 'f' , text [5 : -1 ])
assert_equal ( '' , text [6 : -1 ])
assert_equal ( '' , text [999 : -1 ])
assert_equal ( 'ábçd' , text [: 3 ])
assert_equal ( 'bçdëf' , text [1 :])
2020-08-15 21:10:16 +02:00
assert_equal ( 'ábçdëf' , text [:])
2021-05-06 21:04:55 +02:00
assert_equal ( 'a' , g :astring [0 ])
assert_equal ( 'sd' , g :astring [1 : 2 ])
assert_equal ( 'asdf' , g :astring [:])
2020-08-15 18:39:05 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-12-06 14:37:08 +01:00
lines = < < trim END
2020-12-30 20:39:21 +01:00
var d = 'asdf' [1 :
2020-12-06 14:37:08 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1097:' , 3 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E15:' , 2 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
2020-12-30 20:39:21 +01:00
var d = 'asdf' [1 : xxx ]
2020-12-06 14:37:08 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1001:' , 'E121:' ], 1 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
2020-12-30 20:39:21 +01:00
var d = 'asdf' [1 : 2
2020-12-06 14:37:08 +01:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefFailure ( lines , 'E1097:' , 3 )
v9 .CheckScriptFailure ( ['vim9script' ] + lines , 'E111:' , 2 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
2020-12-30 20:39:21 +01:00
var d = 'asdf' [1 : 2
2020-12-06 14:37:08 +01:00
echo d
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , 'E111:' , 2 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
var d = 'asdf' ['1' ]
echo d
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1012: Type mismatch; expected number but got string' , 'E1030: Using a String as a Number: "1"' ], 1 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
2020-12-30 20:39:21 +01:00
var d = 'asdf' ['1' : 2 ]
2020-12-06 14:37:08 +01:00
echo d
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1012: Type mismatch; expected number but got string' , 'E1030: Using a String as a Number: "1"' ], 1 )
2021-04-04 20:49:50 +02:00
2020-12-06 14:37:08 +01:00
lines = < < trim END
2020-12-30 20:39:21 +01:00
var d = 'asdf' [1 : '2' ]
2020-12-06 14:37:08 +01:00
echo d
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1012: Type mismatch; expected number but got string' , 'E1030: Using a String as a Number: "2"' ], 1 )
2020-08-15 22:14:53 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_list_subscript ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2021-04-04 20:49:50 +02:00
var list = [0 , 1 , 2 , 3 , 4 ]
assert_equal ( 0 , list [0 ])
assert_equal ( 4 , list [4 ])
assert_equal ( 4 , list [-1 ])
assert_equal ( 0 , list [-5 ])
assert_equal ( [0 , 1 , 2 , 3 , 4 ], list [0 : 4 ])
assert_equal ( [0 , 1 , 2 , 3 , 4 ], list [:])
assert_equal ( [1 , 2 , 3 , 4 ], list [1 :])
assert_equal ( [2 , 3 , 4 ], list [2 : -1 ])
assert_equal ( [4 ], list [4 : -1 ])
assert_equal ( [], list [5 : -1 ])
assert_equal ( [], list [999 : -1 ])
assert_equal ( [1 , 2 , 3 , 4 ], list [g :theone : g :thefour ])
assert_equal ( [0 , 1 , 2 , 3 ], list [0 : 3 ])
assert_equal ( [0 ], list [0 : 0 ])
assert_equal ( [0 , 1 , 2 , 3 , 4 ], list [0 : -1 ])
assert_equal ( [0 , 1 , 2 ], list [0 : -3 ])
assert_equal ( [0 ], list [0 : -5 ])
assert_equal ( [], list [0 : -6 ])
assert_equal ( [], list [0 : -99 ])
2021-05-06 21:04:55 +02:00
assert_equal ( 2 , g :alist [0 ])
assert_equal ( [2 , 3 , 4 ], g :alist [:])
2020-08-15 22:14:53 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-08-16 14:48:19 +02:00
2020-09-27 17:57:43 +02:00
lines = ['var l = [0, 1, 2]' , 'echo l[g:astring : g:theone]' ]
2022-01-29 21:45:34 +00:00
v9 .CheckDefExecAndScriptFailure ( lines , ['E1012:' , 'E1030:' ], 2 )
2021-01-10 19:23:27 +01:00
lines = < < trim END
var ld = []
def Func ( )
eval ld [0 ].key
enddef
defcompile
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-07-19 17:55:44 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_dict_subscript ( )
2020-09-27 17:57:43 +02:00
var lines = < < trim END
2020-12-02 17:36:54 +01:00
var l = [{lnum : 2 }, {lnum : 1 }]
2020-09-27 17:57:43 +02:00
var res = l [0 ].lnum > l [1 ].lnum
2020-09-12 21:27:03 +02:00
assert_true ( res )
2021-01-10 19:23:27 +01:00
2021-05-06 21:04:55 +02:00
assert_equal ( 2 , g :adict ['aaa' ])
assert_equal ( 8 , g :adict .bbb )
2021-01-10 19:23:27 +01:00
var dd = {}
def Func1 ( )
eval dd .key1 .key2
enddef
def Func2 ( )
eval dd ['key1' ].key2
enddef
defcompile
2020-09-12 21:27:03 +02:00
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-09-12 21:27:03 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_blob_subscript ( )
2021-05-06 21:04:55 +02:00
var lines = < < trim END
var b = 0 z112233
assert_equal ( 0 x11 , b [0 ])
assert_equal ( 0 z112233 , b [:])
assert_equal ( 0 x01 , g :ablob [0 ])
assert_equal ( 0 z01 ab, g :ablob [:])
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2021-05-06 21:04:55 +02:00
enddef
2022-01-17 20:50:40 +00:00
def Test_expr8_subscript_linebreak ( )
2021-04-04 20:49:50 +02:00
var lines = < < trim END
var range = range (
3 )
var l = range
- > mapnew ( 'string(v:key)' )
assert_equal ( ['0' , '1' , '2' ], l )
2020-06-21 14:12:17 +02:00
2021-04-04 20:49:50 +02:00
l = range
- > mapnew ( 'string(v:key)' )
assert_equal ( ['0' , '1' , '2' ], l )
2020-06-21 16:58:13 +02:00
2021-04-04 20:49:50 +02:00
l = range # comment
- > mapnew ( 'string(v:key)' )
assert_equal ( ['0' , '1' , '2' ], l )
2020-06-21 16:58:13 +02:00
2021-04-04 20:49:50 +02:00
l = range
2020-06-21 16:58:13 +02:00
2021-04-04 20:49:50 +02:00
- > mapnew ( 'string(v:key)' )
assert_equal ( ['0' , '1' , '2' ], l )
2020-06-21 16:58:13 +02:00
2021-04-04 20:49:50 +02:00
l = range
# comment
- > mapnew ( 'string(v:key)' )
assert_equal ( ['0' , '1' , '2' ], l )
assert_equal ( '1' , l [
1 ])
2020-06-21 16:58:13 +02:00
2021-04-04 20:49:50 +02:00
var d = {one : 33 }
assert_equal ( 33 , d
.one )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptSuccess ( lines )
2020-06-21 14:12:17 +02:00
2021-04-04 20:49:50 +02:00
lines = < < trim END
var d = {one : 33 }
assert_equal ( 33 , d .
one )
END
2022-01-29 21:45:34 +00:00
v9 .CheckDefAndScriptFailure ( lines , ['E1127:' , 'E116:' ], 2 )
2020-06-21 14:12:17 +02:00
enddef
2022-01-17 20:50:40 +00:00
func Test_expr8_trailing_fails ( )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ['var l = [2]' , 'l->((ll) => add(ll, 8))' ], 'E107:' , 2 )
call v9 .CheckDefAndScriptFailure ( ['var l = [2]' , 'l->((ll) => add(ll, 8)) ()' ], 'E274:' , 2 )
2020-01-26 15:56:19 +01:00
endfunc
func Test_expr_fails ( )
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["var x = '1'is2" ], 'E488:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var x = '1'isnot2" ], 'E488:' , 1 )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["CallMe ('yes')" ], ['E476:' , 'E492:' ], 1 )
2020-02-19 12:40:39 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["CallMe2('yes','no')" ], 'E1069:' , 1 )
2020-02-25 22:58:29 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["v:nosuch += 3" ], ['E1001:' , 'E121:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["var v:statusmsg = ''" ], 'E1016: Cannot declare a v: variable:' , 1 )
call v9 .CheckDefAndScriptFailure ( ["var asdf = v:nosuch" ], ['E1001:' , 'E121:' ], 1 )
2020-03-28 19:41:33 +01:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefFailure ( ["echo len('asdf'" ], 'E110:' , 2 )
call v9 .CheckScriptFailure ( ['vim9script' , "echo len('asdf'" ], 'E116:' , 2 )
2021-04-04 20:49:50 +02:00
2022-01-29 21:45:34 +00:00
call v9 .CheckDefAndScriptFailure ( ["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()" ], ['E1011:' , 'E117:' ], 1 )
call v9 .CheckDefAndScriptFailure ( ["echo doesnotexist()" ], 'E117:' , 1 )
2020-01-26 15:56:19 +01:00
endfunc
2020-08-12 18:50:36 +02:00
" vim: shiftwidth=2 sts=2 expandtab