let $TESTVAR = 'testvar'
" type casts
-def Test_expr7t()
+def Test_expr7()
var lines =<< trim END
var ls: list<string> = ['a', <string>g:string_empty]
var ln: list<number> = [<number>g:anint, <number>g:thefour]
enddef
" test low level expression
-def Test_expr7_number()
+def Test_expr8_number()
# number constant
var lines =<< trim END
assert_equal(0, 0)
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_float()
+def Test_expr8_float()
# float constant
if !has('float')
MissingFeature 'float'
endif
enddef
-def Test_expr7_blob()
+def Test_expr8_blob()
# blob constant
var lines =<< trim END
assert_equal(g:blob_empty, 0z)
CheckDefAndScriptFailure(["var x = 0z123"], 'E973:', 1)
enddef
-def Test_expr7_string()
+def Test_expr8_string()
# string constant
var lines =<< trim END
assert_equal(g:string_empty, '')
CheckDefAndScriptFailure(["var x = 'abc"], 'E115:', 1)
enddef
-def Test_expr7_vimvar()
+def Test_expr8_vimvar()
v:errors = []
var errs: list<string> = v:errors
CheckDefFailure(['var errs: list<number> = v:errors'], 'E1012:')
bwipe!
enddef
-def Test_expr7_special()
+def Test_expr8_special()
# special constant
var lines =<< trim END
assert_equal(g:special_true, true)
CheckDefAndScriptFailure(['v:none = 22'], 'E46:', 1)
enddef
-def Test_expr7_list()
+def Test_expr8_list()
# list
var lines =<< trim END
assert_equal(g:list_empty, [])
CheckDefAndScriptFailure(lines + ['echo numbers[a :b]'], 'E1004:', 4)
enddef
-def Test_expr7_list_vim9script()
+def Test_expr8_list_vim9script()
var lines =<< trim END
var l = [
11,
x == 2
enddef
-def Test_expr7_lambda()
+def Test_expr8_lambda()
var lines =<< trim END
var La = () => 'result'
# comment
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_lambda_block()
+def Test_expr8_lambda_block()
var lines =<< trim END
var Func = (s: string): string => {
return 'hello ' .. s
x == 2
enddef
-def Test_expr7_new_lambda()
+def Test_expr8_new_lambda()
var lines =<< trim END
var La = () => 'result'
assert_equal('result', La())
CheckDefAndScriptFailure(['var Fx = (a) => [0', ' 1]'], 'E696:', 2)
enddef
-def Test_expr7_lambda_vim9script()
+def Test_expr8_lambda_vim9script()
var lines =<< trim END
var v = 10->((a) =>
a
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_funcref()
+def Test_expr8_funcref()
var lines =<< trim END
def RetNumber(): number
return 123
let g:test_space_dict = {'': 'empty', ' ': 'space'}
let g:test_hash_dict = #{one: 1, two: 2}
-def Test_expr7_dict()
+def Test_expr8_dict()
# dictionary
var lines =<< trim END
assert_equal(g:dict_empty, {})
CheckDefExecAndScriptFailure(['{}[getftype("file")]'], 'E716: Key not present in Dictionary: ""', 1)
enddef
-def Test_expr7_dict_vim9script()
+def Test_expr8_dict_vim9script()
var lines =<< trim END
var d = {
['one']:
CheckScriptSuccess(lines)
enddef
-def Test_expr7_dict_in_block()
+def Test_expr8_dict_in_block()
var lines =<< trim END
vim9script
command MyCommand {
delcommand YourCommand
enddef
-def Test_expr7_call_2bool()
+def Test_expr8_call_2bool()
var lines =<< trim END
vim9script
CheckDefExecAndScriptFailure(["var d: dict<number>", "d = g:list_empty"], 'E1012: Type mismatch; expected dict<number> but got list<unknown>', 2)
enddef
-def Test_expr7_any_index_slice()
+def Test_expr8_any_index_slice()
var lines =<< trim END
# getting the one member should clear the list only after getting the item
assert_equal('bbb', ['aaa', 'bbb', 'ccc'][1])
b:someVar = &fdm
enddef
-def Test_expr7_option()
+def Test_expr8_option()
var lines =<< trim END
# option
set ts=11
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_environment()
+def Test_expr8_environment()
var lines =<< trim END
# environment variable
assert_equal('testvar', $TESTVAR)
CheckDefAndScriptFailure(["$"], ['E1002:', 'E15:'], 1)
enddef
-def Test_expr7_register()
+def Test_expr8_register()
var lines =<< trim END
@a = 'register a'
assert_equal('register a', @a)
enddef
" This is slow when run under valgrind.
-def Test_expr7_namespace()
+def Test_expr8_namespace()
var lines =<< trim END
g:some_var = 'some'
assert_equal('some', get(g:, 'some_var'))
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_namespace_loop_def()
+def Test_expr8_namespace_loop_def()
var lines =<< trim END
# check using g: in a for loop more than DO_NOT_FREE_CNT times
var exists = 0
enddef
" NOTE: this is known to be slow. To skip use:
-" :let $TEST_SKIP_PAT = 'Test_expr7_namespace_loop_script'
-def Test_expr7_namespace_loop_script()
+" :let $TEST_SKIP_PAT = 'Test_expr8_namespace_loop_script'
+def Test_expr8_namespace_loop_script()
var lines =<< trim END
vim9script
# check using g: in a for loop more than DO_NOT_FREE_CNT times
CheckScriptSuccess(lines)
enddef
-def Test_expr7_parens()
+def Test_expr8_parens()
# (expr)
var lines =<< trim END
assert_equal(4, (6 * 4) / 6)
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_negate_add()
+def Test_expr8_negate_add()
var lines =<< trim END
assert_equal(-99, -99)
assert_equal(-99, - 99)
legacy return #{key: 'ok'}.key
enddef
-def Test_expr7_legacy_script()
+def Test_expr8_legacy_script()
var lines =<< trim END
let s:legacy = 'legacy'
def GetLocal(): string
return arg
enddef
-def Test_expr7_call()
+def Test_expr8_call()
var lines =<< trim END
assert_equal('yes', 'yes'->Echo())
assert_equal(true, !range(5)->empty())
delete('Xruntime', 'rf')
enddef
-def Test_expr7_method_call()
+def Test_expr8_method_call()
var lines =<< trim END
new
setline(1, ['first', 'last'])
CheckDefExecFailure(lines, 'E1013:')
enddef
-def Test_expr7_method_call_linebreak()
+def Test_expr8_method_call_linebreak()
# this was giving an error when skipping over the expression
var lines =<< trim END
vim9script
CheckScriptSuccess(lines)
enddef
+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
+ CheckScriptSuccess(lines)
+
+ delete('Xsquare.vim')
+enddef
+
-def Test_expr7_not()
+def Test_expr8_not()
var lines =<< trim END
assert_equal(true, !'')
assert_equal(true, ![])
let g:anumber = 42
-def Test_expr7_negate()
+def Test_expr8_negate()
var lines =<< trim END
var nr = 1
assert_equal(-1, -nr)
CheckDefAndScriptSuccess(lines)
enddef
-func Test_expr7_fails()
+func Test_expr8_fails()
call CheckDefFailure(["var x = (12"], "E1097:", 3)
call CheckScriptFailure(['vim9script', "var x = (12"], 'E110:', 2)
return a:one .. a:two
endfunc
-def Test_expr7_trailing()
+def Test_expr8_trailing()
var lines =<< trim END
# user function call
assert_equal(123, g:CallMe(123))
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_string_subscript()
+def Test_expr8_string_subscript()
var lines =<< trim END
var text = 'abcdef'
assert_equal('f', text[-1])
CheckDefAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "2"'], 1)
enddef
-def Test_expr7_list_subscript()
+def Test_expr8_list_subscript()
var lines =<< trim END
var list = [0, 1, 2, 3, 4]
assert_equal(0, list[0])
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_dict_subscript()
+def Test_expr8_dict_subscript()
var lines =<< trim END
var l = [{lnum: 2}, {lnum: 1}]
var res = l[0].lnum > l[1].lnum
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_blob_subscript()
+def Test_expr8_blob_subscript()
var lines =<< trim END
var b = 0z112233
assert_equal(0x11, b[0])
CheckDefAndScriptSuccess(lines)
enddef
-def Test_expr7_subscript_linebreak()
+def Test_expr8_subscript_linebreak()
var lines =<< trim END
var range = range(
3)
CheckDefAndScriptFailure(lines, ['E1127:', 'E116:'], 2)
enddef
-func Test_expr7_trailing_fails()
+func Test_expr8_trailing_fails()
call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8))'], 'E107:', 2)
call CheckDefAndScriptFailure(['var l = [2]', 'l->((ll) => add(ll, 8)) ()'], 'E274:', 2)
endfunc