18a7d6542SBram Moolenaar" Test various aspects of the Vim9 script language. 28a7d6542SBram Moolenaar 3673660abSBram Moolenaarsource check.vim 4101f4810SBram Moolenaarsource term_util.vim 5ad39c094SBram Moolenaarsource view_util.vim 6cfe435d7SBram Moolenaarsource vim9.vim 7e3d4685fSBram Moolenaarsource shared.vim 88a7d6542SBram Moolenaar 95d72ce69SBram Moolenaardef Test_range_only() 105d72ce69SBram Moolenaar new 115d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 125d72ce69SBram Moolenaar :/Blah/ 135d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 14c2af0affSBram Moolenaar bwipe! 15c2af0affSBram Moolenaar 16c2af0affSBram Moolenaar # without range commands use current line 17c2af0affSBram Moolenaar new 18c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 19c2af0affSBram Moolenaar :2 20c2af0affSBram Moolenaar print 21c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 22c2af0affSBram Moolenaar :3 23c2af0affSBram Moolenaar list 24c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 25c2af0affSBram Moolenaar bwipe! 265d72ce69SBram Moolenaarenddef 275d72ce69SBram Moolenaar 28a6e67e4fSBram Moolenaarlet g:alist = [7] 29a6e67e4fSBram Moolenaarlet g:astring = 'text' 30f0b9f43cSBram Moolenaarlet g:anumber = 123 316e587dcbSBram Moolenaar 32d72c1bf0SBram Moolenaardef Test_unlet() 33d72c1bf0SBram Moolenaar g:somevar = 'yes' 34d72c1bf0SBram Moolenaar assert_true(exists('g:somevar')) 35d72c1bf0SBram Moolenaar unlet g:somevar 36d72c1bf0SBram Moolenaar assert_false(exists('g:somevar')) 37d72c1bf0SBram Moolenaar unlet! g:somevar 38d72c1bf0SBram Moolenaar 398436773fSBram Moolenaar # also works for script-local variable in legacy Vim script 408436773fSBram Moolenaar s:somevar = 'legacy' 418436773fSBram Moolenaar assert_true(exists('s:somevar')) 428436773fSBram Moolenaar unlet s:somevar 438436773fSBram Moolenaar assert_false(exists('s:somevar')) 448436773fSBram Moolenaar unlet! s:somevar 458436773fSBram Moolenaar 46d2c61705SBram Moolenaar CheckScriptFailure([ 47d72c1bf0SBram Moolenaar 'vim9script', 48d72c1bf0SBram Moolenaar 'let svar = 123', 49d72c1bf0SBram Moolenaar 'unlet svar', 50d72c1bf0SBram Moolenaar ], 'E1081:') 51d2c61705SBram Moolenaar CheckScriptFailure([ 52d72c1bf0SBram Moolenaar 'vim9script', 53d72c1bf0SBram Moolenaar 'let svar = 123', 54d72c1bf0SBram Moolenaar 'unlet s:svar', 55d72c1bf0SBram Moolenaar ], 'E1081:') 56d2c61705SBram Moolenaar CheckScriptFailure([ 57d72c1bf0SBram Moolenaar 'vim9script', 58d72c1bf0SBram Moolenaar 'let svar = 123', 59d72c1bf0SBram Moolenaar 'def Func()', 60d72c1bf0SBram Moolenaar ' unlet svar', 61d72c1bf0SBram Moolenaar 'enddef', 62822ba247SBram Moolenaar 'defcompile', 63d72c1bf0SBram Moolenaar ], 'E1081:') 64d2c61705SBram Moolenaar CheckScriptFailure([ 65d72c1bf0SBram Moolenaar 'vim9script', 66d72c1bf0SBram Moolenaar 'let svar = 123', 67d72c1bf0SBram Moolenaar 'def Func()', 68d72c1bf0SBram Moolenaar ' unlet s:svar', 69d72c1bf0SBram Moolenaar 'enddef', 70822ba247SBram Moolenaar 'defcompile', 71d72c1bf0SBram Moolenaar ], 'E1081:') 727bdaea6eSBram Moolenaar 737bdaea6eSBram Moolenaar $ENVVAR = 'foobar' 747bdaea6eSBram Moolenaar assert_equal('foobar', $ENVVAR) 757bdaea6eSBram Moolenaar unlet $ENVVAR 767bdaea6eSBram Moolenaar assert_equal('', $ENVVAR) 77d72c1bf0SBram Moolenaarenddef 78599c89c8SBram Moolenaar 794c17ad94SBram Moolenaardef Test_delfunction() 80f5be8cdbSBram Moolenaar # Check function is defined in script namespace 814c17ad94SBram Moolenaar CheckScriptSuccess([ 824c17ad94SBram Moolenaar 'vim9script', 834c17ad94SBram Moolenaar 'func CheckMe()', 844c17ad94SBram Moolenaar ' return 123', 854c17ad94SBram Moolenaar 'endfunc', 864c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 874c17ad94SBram Moolenaar ]) 884c17ad94SBram Moolenaar 89f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 904c17ad94SBram Moolenaar CheckScriptFailure([ 914c17ad94SBram Moolenaar 'vim9script', 924c17ad94SBram Moolenaar 'func DeleteMe1()', 934c17ad94SBram Moolenaar 'endfunc', 944c17ad94SBram Moolenaar 'delfunction DeleteMe1', 954c17ad94SBram Moolenaar ], 'E1084:') 964c17ad94SBram Moolenaar CheckScriptFailure([ 974c17ad94SBram Moolenaar 'vim9script', 984c17ad94SBram Moolenaar 'func DeleteMe2()', 994c17ad94SBram Moolenaar 'endfunc', 1004c17ad94SBram Moolenaar 'def DoThat()', 1014c17ad94SBram Moolenaar ' delfunction DeleteMe2', 1024c17ad94SBram Moolenaar 'enddef', 1034c17ad94SBram Moolenaar 'DoThat()', 1044c17ad94SBram Moolenaar ], 'E1084:') 1054c17ad94SBram Moolenaar CheckScriptFailure([ 1064c17ad94SBram Moolenaar 'vim9script', 1074c17ad94SBram Moolenaar 'def DeleteMe3()', 1084c17ad94SBram Moolenaar 'enddef', 1094c17ad94SBram Moolenaar 'delfunction DeleteMe3', 1104c17ad94SBram Moolenaar ], 'E1084:') 1114c17ad94SBram Moolenaar CheckScriptFailure([ 1124c17ad94SBram Moolenaar 'vim9script', 1134c17ad94SBram Moolenaar 'def DeleteMe4()', 1144c17ad94SBram Moolenaar 'enddef', 1154c17ad94SBram Moolenaar 'def DoThat()', 1164c17ad94SBram Moolenaar ' delfunction DeleteMe4', 1174c17ad94SBram Moolenaar 'enddef', 1184c17ad94SBram Moolenaar 'DoThat()', 1194c17ad94SBram Moolenaar ], 'E1084:') 120925e9fd6SBram Moolenaar 121925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 122925e9fd6SBram Moolenaar let lines =<< trim END 123925e9fd6SBram Moolenaar vim9script 124925e9fd6SBram Moolenaar def g:Global(): string 125925e9fd6SBram Moolenaar return "yes" 126925e9fd6SBram Moolenaar enddef 127925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 128925e9fd6SBram Moolenaar def! g:Global(): string 129925e9fd6SBram Moolenaar return "no" 130925e9fd6SBram Moolenaar enddef 131925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 132925e9fd6SBram Moolenaar delfunc g:Global 133925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 134925e9fd6SBram Moolenaar END 135925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 136925e9fd6SBram Moolenaar 137925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 138925e9fd6SBram Moolenaar lines =<< trim END 139925e9fd6SBram Moolenaar vim9script 140925e9fd6SBram Moolenaar func g:Global() 141925e9fd6SBram Moolenaar return "yes" 142925e9fd6SBram Moolenaar endfunc 143925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 144925e9fd6SBram Moolenaar def! g:Global(): string 145925e9fd6SBram Moolenaar return "no" 146925e9fd6SBram Moolenaar enddef 147925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 148925e9fd6SBram Moolenaar delfunc g:Global 149925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 150925e9fd6SBram Moolenaar END 151925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 152925e9fd6SBram Moolenaar 153925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 154925e9fd6SBram Moolenaar lines =<< trim END 155925e9fd6SBram Moolenaar vim9script 156925e9fd6SBram Moolenaar def g:Global(): string 157925e9fd6SBram Moolenaar return "yes" 158925e9fd6SBram Moolenaar enddef 159925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 160925e9fd6SBram Moolenaar func! g:Global() 161925e9fd6SBram Moolenaar return "no" 162925e9fd6SBram Moolenaar endfunc 163925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 164925e9fd6SBram Moolenaar delfunc g:Global 165925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 166925e9fd6SBram Moolenaar END 167925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1684c17ad94SBram Moolenaarenddef 1694c17ad94SBram Moolenaar 17008052228SBram Moolenaardef Test_wrong_type() 17108052228SBram Moolenaar CheckDefFailure(['let var: list<nothing>'], 'E1010:') 17208052228SBram Moolenaar CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:') 17308052228SBram Moolenaar CheckDefFailure(['let var: dict<nothing>'], 'E1010:') 17408052228SBram Moolenaar CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:') 175599c89c8SBram Moolenaar 17608052228SBram Moolenaar CheckDefFailure(['let var: dict<number'], 'E1009:') 17708052228SBram Moolenaar CheckDefFailure(['let var: dict<list<number>'], 'E1009:') 17842a480bfSBram Moolenaar 17908052228SBram Moolenaar CheckDefFailure(['let var: ally'], 'E1010:') 18008052228SBram Moolenaar CheckDefFailure(['let var: bram'], 'E1010:') 18108052228SBram Moolenaar CheckDefFailure(['let var: cathy'], 'E1010:') 18208052228SBram Moolenaar CheckDefFailure(['let var: dom'], 'E1010:') 18308052228SBram Moolenaar CheckDefFailure(['let var: freddy'], 'E1010:') 18408052228SBram Moolenaar CheckDefFailure(['let var: john'], 'E1010:') 18508052228SBram Moolenaar CheckDefFailure(['let var: larry'], 'E1010:') 18608052228SBram Moolenaar CheckDefFailure(['let var: ned'], 'E1010:') 18708052228SBram Moolenaar CheckDefFailure(['let var: pam'], 'E1010:') 18808052228SBram Moolenaar CheckDefFailure(['let var: sam'], 'E1010:') 18908052228SBram Moolenaar CheckDefFailure(['let var: vim'], 'E1010:') 190a0a9f43aSBram Moolenaar 19108052228SBram Moolenaar CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:') 19208052228SBram Moolenaar CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:') 19308052228SBram Moolenaarenddef 1948a7d6542SBram Moolenaar 19508052228SBram Moolenaardef Test_const() 19608052228SBram Moolenaar CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:') 19708052228SBram Moolenaar CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:') 198dbeecb2bSBram Moolenaar CheckDefFailure(['const list = [1, 2]', 'let list = [3, 4]'], 'E1017:') 19908052228SBram Moolenaar CheckDefFailure(['const two'], 'E1021:') 20008052228SBram Moolenaar CheckDefFailure(['const &option'], 'E996:') 201dbeecb2bSBram Moolenaar 202dbeecb2bSBram Moolenaar let lines =<< trim END 203dbeecb2bSBram Moolenaar const list = [1, 2, 3] 204dbeecb2bSBram Moolenaar list[0] = 4 2050b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 2060b4c66c6SBram Moolenaar const! other = [5, 6, 7] 2070b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 20871abe482SBram Moolenaar 20971abe482SBram Moolenaar let varlist = [7, 8] 21071abe482SBram Moolenaar const! constlist = [1, varlist, 3] 21171abe482SBram Moolenaar varlist[0] = 77 21271abe482SBram Moolenaar # TODO: does not work yet 21371abe482SBram Moolenaar # constlist[1][1] = 88 21471abe482SBram Moolenaar let cl = constlist[1] 21571abe482SBram Moolenaar cl[1] = 88 21671abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 21771abe482SBram Moolenaar 21871abe482SBram Moolenaar let vardict = #{five: 5, six: 6} 21971abe482SBram Moolenaar const! constdict = #{one: 1, two: vardict, three: 3} 22071abe482SBram Moolenaar vardict['five'] = 55 22171abe482SBram Moolenaar # TODO: does not work yet 22271abe482SBram Moolenaar # constdict['two']['six'] = 66 22371abe482SBram Moolenaar let cd = constdict['two'] 22471abe482SBram Moolenaar cd['six'] = 66 22571abe482SBram Moolenaar constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3}) 226dbeecb2bSBram Moolenaar END 227dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 22808052228SBram Moolenaarenddef 2298a7d6542SBram Moolenaar 2300b4c66c6SBram Moolenaardef Test_const_bang() 2310b4c66c6SBram Moolenaar let lines =<< trim END 2320b4c66c6SBram Moolenaar const! var = 234 2330b4c66c6SBram Moolenaar var = 99 2340b4c66c6SBram Moolenaar END 2350b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 2360b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 2370b4c66c6SBram Moolenaar 2380b4c66c6SBram Moolenaar lines =<< trim END 2390b4c66c6SBram Moolenaar const! ll = [2, 3, 4] 2400b4c66c6SBram Moolenaar ll[0] = 99 2410b4c66c6SBram Moolenaar END 2420b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2430b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2440b4c66c6SBram Moolenaar 2450b4c66c6SBram Moolenaar lines =<< trim END 2460b4c66c6SBram Moolenaar const! ll = [2, 3, 4] 2470b4c66c6SBram Moolenaar ll[3] = 99 2480b4c66c6SBram Moolenaar END 2490b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2500b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2510b4c66c6SBram Moolenaar 2520b4c66c6SBram Moolenaar lines =<< trim END 2530b4c66c6SBram Moolenaar const! dd = #{one: 1, two: 2} 2540b4c66c6SBram Moolenaar dd["one"] = 99 2550b4c66c6SBram Moolenaar END 2560b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2570b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2580b4c66c6SBram Moolenaar 2590b4c66c6SBram Moolenaar lines =<< trim END 2600b4c66c6SBram Moolenaar const! dd = #{one: 1, two: 2} 2610b4c66c6SBram Moolenaar dd["three"] = 99 2620b4c66c6SBram Moolenaar END 2630b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2640b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2650b4c66c6SBram Moolenaarenddef 2660b4c66c6SBram Moolenaar 267df069eecSBram Moolenaardef Test_range_no_colon() 268d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 269d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 270d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 271d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 272df069eecSBram Moolenaarenddef 273df069eecSBram Moolenaar 274df069eecSBram Moolenaar 2758a7d6542SBram Moolenaardef Test_block() 2768a7d6542SBram Moolenaar let outer = 1 2778a7d6542SBram Moolenaar { 2788a7d6542SBram Moolenaar let inner = 2 2798a7d6542SBram Moolenaar assert_equal(1, outer) 2808a7d6542SBram Moolenaar assert_equal(2, inner) 2818a7d6542SBram Moolenaar } 2828a7d6542SBram Moolenaar assert_equal(1, outer) 2838a7d6542SBram Moolenaarenddef 2848a7d6542SBram Moolenaar 28508052228SBram Moolenaardef Test_block_failure() 28608052228SBram Moolenaar CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:') 28708052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 28808052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 28908052228SBram Moolenaarenddef 2908a7d6542SBram Moolenaar 291d032f34aSBram Moolenaarfunc g:NoSuchFunc() 292d032f34aSBram Moolenaar echo 'none' 293d032f34aSBram Moolenaarendfunc 294d032f34aSBram Moolenaar 2958a7d6542SBram Moolenaardef Test_try_catch() 2968a7d6542SBram Moolenaar let l = [] 2977a092245SBram Moolenaar try # comment 2988a7d6542SBram Moolenaar add(l, '1') 2998a7d6542SBram Moolenaar throw 'wrong' 3008a7d6542SBram Moolenaar add(l, '2') 3017a092245SBram Moolenaar catch # comment 3028a7d6542SBram Moolenaar add(l, v:exception) 3037a092245SBram Moolenaar finally # comment 3048a7d6542SBram Moolenaar add(l, '3') 3057a092245SBram Moolenaar endtry # comment 3068a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 30768d130c6SBram Moolenaar 308e859312eSBram Moolenaar l = [] 309e859312eSBram Moolenaar try 310e859312eSBram Moolenaar try 311e859312eSBram Moolenaar add(l, '1') 312e859312eSBram Moolenaar throw 'wrong' 313e859312eSBram Moolenaar add(l, '2') 314e859312eSBram Moolenaar catch /right/ 315e859312eSBram Moolenaar add(l, v:exception) 316e859312eSBram Moolenaar endtry 317e859312eSBram Moolenaar catch /wrong/ 318e859312eSBram Moolenaar add(l, 'caught') 319e859312eSBram Moolenaar finally 320e859312eSBram Moolenaar add(l, 'finally') 321e859312eSBram Moolenaar endtry 322e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 323e859312eSBram Moolenaar 32468d130c6SBram Moolenaar let n: number 32568d130c6SBram Moolenaar try 32668d130c6SBram Moolenaar n = l[3] 32768d130c6SBram Moolenaar catch /E684:/ 32868d130c6SBram Moolenaar n = 99 32968d130c6SBram Moolenaar endtry 33068d130c6SBram Moolenaar assert_equal(99, n) 33168d130c6SBram Moolenaar 33268d130c6SBram Moolenaar try 333cc673e74SBram Moolenaar # string slice returns a string, not a number 33468d130c6SBram Moolenaar n = g:astring[3] 3355e654230SBram Moolenaar catch /E1012:/ 33668d130c6SBram Moolenaar n = 77 33768d130c6SBram Moolenaar endtry 33868d130c6SBram Moolenaar assert_equal(77, n) 33968d130c6SBram Moolenaar 34068d130c6SBram Moolenaar try 34168d130c6SBram Moolenaar n = l[g:astring] 3425e654230SBram Moolenaar catch /E1012:/ 34356acb094SBram Moolenaar n = 88 34468d130c6SBram Moolenaar endtry 34556acb094SBram Moolenaar assert_equal(88, n) 34668d130c6SBram Moolenaar 34768d130c6SBram Moolenaar try 34868d130c6SBram Moolenaar n = s:does_not_exist 34968d130c6SBram Moolenaar catch /E121:/ 350f0b9f43cSBram Moolenaar n = 111 351f0b9f43cSBram Moolenaar endtry 352f0b9f43cSBram Moolenaar assert_equal(111, n) 353f0b9f43cSBram Moolenaar 354f0b9f43cSBram Moolenaar try 355f0b9f43cSBram Moolenaar n = g:does_not_exist 356f0b9f43cSBram Moolenaar catch /E121:/ 35768d130c6SBram Moolenaar n = 121 35868d130c6SBram Moolenaar endtry 35968d130c6SBram Moolenaar assert_equal(121, n) 36068d130c6SBram Moolenaar 36168d130c6SBram Moolenaar let d = #{one: 1} 36268d130c6SBram Moolenaar try 36368d130c6SBram Moolenaar n = d[g:astring] 36468d130c6SBram Moolenaar catch /E716:/ 36568d130c6SBram Moolenaar n = 222 36668d130c6SBram Moolenaar endtry 36768d130c6SBram Moolenaar assert_equal(222, n) 368f0b9f43cSBram Moolenaar 369f0b9f43cSBram Moolenaar try 370f0b9f43cSBram Moolenaar n = -g:astring 371f0b9f43cSBram Moolenaar catch /E39:/ 372f0b9f43cSBram Moolenaar n = 233 373f0b9f43cSBram Moolenaar endtry 374f0b9f43cSBram Moolenaar assert_equal(233, n) 375f0b9f43cSBram Moolenaar 376f0b9f43cSBram Moolenaar try 377f0b9f43cSBram Moolenaar n = +g:astring 378f0b9f43cSBram Moolenaar catch /E1030:/ 379f0b9f43cSBram Moolenaar n = 244 380f0b9f43cSBram Moolenaar endtry 381f0b9f43cSBram Moolenaar assert_equal(244, n) 382f0b9f43cSBram Moolenaar 383f0b9f43cSBram Moolenaar try 384f0b9f43cSBram Moolenaar n = +g:alist 385f0b9f43cSBram Moolenaar catch /E745:/ 386f0b9f43cSBram Moolenaar n = 255 387f0b9f43cSBram Moolenaar endtry 388f0b9f43cSBram Moolenaar assert_equal(255, n) 389f0b9f43cSBram Moolenaar 390f0b9f43cSBram Moolenaar let nd: dict<any> 391f0b9f43cSBram Moolenaar try 392f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 3935e654230SBram Moolenaar catch /E1012:/ 394f0b9f43cSBram Moolenaar n = 266 395f0b9f43cSBram Moolenaar endtry 396f0b9f43cSBram Moolenaar assert_equal(266, n) 397f0b9f43cSBram Moolenaar 398f0b9f43cSBram Moolenaar try 399f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 400f0b9f43cSBram Moolenaar catch /E1093:/ 401f0b9f43cSBram Moolenaar n = 277 402f0b9f43cSBram Moolenaar endtry 403f0b9f43cSBram Moolenaar assert_equal(277, n) 404f0b9f43cSBram Moolenaar 405e859312eSBram Moolenaar try 406e859312eSBram Moolenaar &ts = g:astring 4075e654230SBram Moolenaar catch /E1012:/ 408e859312eSBram Moolenaar n = 288 409e859312eSBram Moolenaar endtry 410e859312eSBram Moolenaar assert_equal(288, n) 411e859312eSBram Moolenaar 412e859312eSBram Moolenaar try 413e859312eSBram Moolenaar &backspace = 'asdf' 414e859312eSBram Moolenaar catch /E474:/ 415e859312eSBram Moolenaar n = 299 416e859312eSBram Moolenaar endtry 417e859312eSBram Moolenaar assert_equal(299, n) 418e859312eSBram Moolenaar 419e859312eSBram Moolenaar l = [1] 420e859312eSBram Moolenaar try 421e859312eSBram Moolenaar l[3] = 3 422e859312eSBram Moolenaar catch /E684:/ 423e859312eSBram Moolenaar n = 300 424e859312eSBram Moolenaar endtry 425e859312eSBram Moolenaar assert_equal(300, n) 426e859312eSBram Moolenaar 427e859312eSBram Moolenaar try 428e859312eSBram Moolenaar unlet g:does_not_exist 429e859312eSBram Moolenaar catch /E108:/ 430e859312eSBram Moolenaar n = 322 431e859312eSBram Moolenaar endtry 432e859312eSBram Moolenaar assert_equal(322, n) 433e859312eSBram Moolenaar 434e859312eSBram Moolenaar try 435e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 436e859312eSBram Moolenaar catch /E721:/ 437e859312eSBram Moolenaar n = 333 438e859312eSBram Moolenaar endtry 439e859312eSBram Moolenaar assert_equal(333, n) 440e859312eSBram Moolenaar 441e859312eSBram Moolenaar try 442e859312eSBram Moolenaar l = DeletedFunc() 443e859312eSBram Moolenaar catch /E933:/ 444e859312eSBram Moolenaar n = 344 445e859312eSBram Moolenaar endtry 446e859312eSBram Moolenaar assert_equal(344, n) 447d032f34aSBram Moolenaar 448d032f34aSBram Moolenaar try 449d032f34aSBram Moolenaar echo len(v:true) 450d032f34aSBram Moolenaar catch /E701:/ 451d032f34aSBram Moolenaar n = 355 452d032f34aSBram Moolenaar endtry 453d032f34aSBram Moolenaar assert_equal(355, n) 454d032f34aSBram Moolenaar 455d032f34aSBram Moolenaar let P = function('g:NoSuchFunc') 456d032f34aSBram Moolenaar delfunc g:NoSuchFunc 457d032f34aSBram Moolenaar try 458d032f34aSBram Moolenaar echo P() 459d032f34aSBram Moolenaar catch /E117:/ 460d032f34aSBram Moolenaar n = 366 461d032f34aSBram Moolenaar endtry 462d032f34aSBram Moolenaar assert_equal(366, n) 463d032f34aSBram Moolenaar 464d032f34aSBram Moolenaar try 465d032f34aSBram Moolenaar echo g:NoSuchFunc() 466d032f34aSBram Moolenaar catch /E117:/ 467d032f34aSBram Moolenaar n = 377 468d032f34aSBram Moolenaar endtry 469d032f34aSBram Moolenaar assert_equal(377, n) 470d032f34aSBram Moolenaar 471d032f34aSBram Moolenaar try 472d032f34aSBram Moolenaar echo g:alist + 4 473d032f34aSBram Moolenaar catch /E745:/ 474d032f34aSBram Moolenaar n = 388 475d032f34aSBram Moolenaar endtry 476d032f34aSBram Moolenaar assert_equal(388, n) 477d032f34aSBram Moolenaar 478d032f34aSBram Moolenaar try 479d032f34aSBram Moolenaar echo 4 + g:alist 480d032f34aSBram Moolenaar catch /E745:/ 481d032f34aSBram Moolenaar n = 399 482d032f34aSBram Moolenaar endtry 483d032f34aSBram Moolenaar assert_equal(399, n) 484d032f34aSBram Moolenaar 485d032f34aSBram Moolenaar try 486d032f34aSBram Moolenaar echo g:alist.member 487d032f34aSBram Moolenaar catch /E715:/ 488d032f34aSBram Moolenaar n = 400 489d032f34aSBram Moolenaar endtry 490d032f34aSBram Moolenaar assert_equal(400, n) 491d032f34aSBram Moolenaar 492d032f34aSBram Moolenaar try 493d032f34aSBram Moolenaar echo d.member 494d032f34aSBram Moolenaar catch /E716:/ 495d032f34aSBram Moolenaar n = 411 496d032f34aSBram Moolenaar endtry 497d032f34aSBram Moolenaar assert_equal(411, n) 4988a7d6542SBram Moolenaarenddef 4998a7d6542SBram Moolenaar 500e859312eSBram Moolenaardef DeletedFunc(): list<any> 501e859312eSBram Moolenaar return ['delete me'] 502e859312eSBram Moolenaarenddef 503e859312eSBram Moolenaardefcompile 504e859312eSBram Moolenaardelfunc DeletedFunc 505e859312eSBram Moolenaar 506257cc5eeSBram Moolenaardef ThrowFromDef() 507a72cfb80SBram Moolenaar throw "getout" # comment 508257cc5eeSBram Moolenaarenddef 509257cc5eeSBram Moolenaar 510257cc5eeSBram Moolenaarfunc CatchInFunc() 511257cc5eeSBram Moolenaar try 512257cc5eeSBram Moolenaar call ThrowFromDef() 513257cc5eeSBram Moolenaar catch 514257cc5eeSBram Moolenaar let g:thrown_func = v:exception 515257cc5eeSBram Moolenaar endtry 516257cc5eeSBram Moolenaarendfunc 517257cc5eeSBram Moolenaar 518257cc5eeSBram Moolenaardef CatchInDef() 519257cc5eeSBram Moolenaar try 520257cc5eeSBram Moolenaar ThrowFromDef() 521257cc5eeSBram Moolenaar catch 522257cc5eeSBram Moolenaar g:thrown_def = v:exception 523257cc5eeSBram Moolenaar endtry 524257cc5eeSBram Moolenaarenddef 525257cc5eeSBram Moolenaar 526f575adffSBram Moolenaardef ReturnFinally(): string 527f575adffSBram Moolenaar try 528f575adffSBram Moolenaar return 'intry' 529f575adffSBram Moolenaar finally 530f575adffSBram Moolenaar g:in_finally = 'finally' 531f575adffSBram Moolenaar endtry 532f575adffSBram Moolenaar return 'end' 533f575adffSBram Moolenaarenddef 534f575adffSBram Moolenaar 535257cc5eeSBram Moolenaardef Test_try_catch_nested() 536257cc5eeSBram Moolenaar CatchInFunc() 537257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 538257cc5eeSBram Moolenaar 539257cc5eeSBram Moolenaar CatchInDef() 540257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 541f575adffSBram Moolenaar 542f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 543f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 544f575adffSBram Moolenaarenddef 545f575adffSBram Moolenaar 5469939f57bSBram Moolenaardef TryOne(): number 5479939f57bSBram Moolenaar try 5489939f57bSBram Moolenaar return 0 5499939f57bSBram Moolenaar catch 5509939f57bSBram Moolenaar endtry 5519939f57bSBram Moolenaar return 0 5529939f57bSBram Moolenaarenddef 5539939f57bSBram Moolenaar 5549939f57bSBram Moolenaardef TryTwo(n: number): string 5559939f57bSBram Moolenaar try 5569939f57bSBram Moolenaar let x = {} 5579939f57bSBram Moolenaar catch 5589939f57bSBram Moolenaar endtry 5599939f57bSBram Moolenaar return 'text' 5609939f57bSBram Moolenaarenddef 5619939f57bSBram Moolenaar 5629939f57bSBram Moolenaardef Test_try_catch_twice() 5639939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 5649939f57bSBram Moolenaarenddef 5659939f57bSBram Moolenaar 566f575adffSBram Moolenaardef Test_try_catch_match() 567f575adffSBram Moolenaar let seq = 'a' 568f575adffSBram Moolenaar try 569f575adffSBram Moolenaar throw 'something' 570f575adffSBram Moolenaar catch /nothing/ 571f575adffSBram Moolenaar seq ..= 'x' 572f575adffSBram Moolenaar catch /some/ 573f575adffSBram Moolenaar seq ..= 'b' 574f575adffSBram Moolenaar catch /asdf/ 575f575adffSBram Moolenaar seq ..= 'x' 576e8c4abbbSBram Moolenaar catch ?a\?sdf? 577e8c4abbbSBram Moolenaar seq ..= 'y' 578f575adffSBram Moolenaar finally 579f575adffSBram Moolenaar seq ..= 'c' 580f575adffSBram Moolenaar endtry 581f575adffSBram Moolenaar assert_equal('abc', seq) 582257cc5eeSBram Moolenaarenddef 583257cc5eeSBram Moolenaar 584e8c4abbbSBram Moolenaardef Test_try_catch_fails() 585d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 586d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 587d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 588d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 589d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 590d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 591d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 592d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 593d2c61705SBram Moolenaar CheckDefFailure(['if 2', 'endtry'], 'E171:') 594d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 595585fea7bSBram Moolenaar 596d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 597d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 598e8c4abbbSBram Moolenaarenddef 599e8c4abbbSBram Moolenaar 600006ad48bSBram Moolenaardef Test_throw_vimscript() 601f5be8cdbSBram Moolenaar # only checks line continuation 602006ad48bSBram Moolenaar let lines =<< trim END 603006ad48bSBram Moolenaar vim9script 604006ad48bSBram Moolenaar try 605006ad48bSBram Moolenaar throw 'one' 606006ad48bSBram Moolenaar .. 'two' 607006ad48bSBram Moolenaar catch 608006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 609006ad48bSBram Moolenaar endtry 610006ad48bSBram Moolenaar END 611006ad48bSBram Moolenaar CheckScriptSuccess(lines) 612006ad48bSBram Moolenaarenddef 613006ad48bSBram Moolenaar 614ed677f55SBram Moolenaardef Test_error_in_nested_function() 615ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 616ed677f55SBram Moolenaar let lines =<< trim END 617ed677f55SBram Moolenaar vim9script 618ed677f55SBram Moolenaar def Func() 619ed677f55SBram Moolenaar Error() 620ed677f55SBram Moolenaar g:test_var = 1 621ed677f55SBram Moolenaar enddef 622ed677f55SBram Moolenaar func Error() abort 623ed677f55SBram Moolenaar eval [][0] 624ed677f55SBram Moolenaar endfunc 625ed677f55SBram Moolenaar Func() 626ed677f55SBram Moolenaar END 627ed677f55SBram Moolenaar g:test_var = 0 628ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 629ed677f55SBram Moolenaar assert_equal(0, g:test_var) 630ed677f55SBram Moolenaarenddef 631ed677f55SBram Moolenaar 63237c83711SBram Moolenaardef Test_cexpr_vimscript() 633f5be8cdbSBram Moolenaar # only checks line continuation 63437c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 63537c83711SBram Moolenaar let lines =<< trim END 63637c83711SBram Moolenaar vim9script 63737c83711SBram Moolenaar cexpr 'File' 63837c83711SBram Moolenaar .. ' someFile' .. 63937c83711SBram Moolenaar ' line 19' 64037c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 64137c83711SBram Moolenaar END 64237c83711SBram Moolenaar CheckScriptSuccess(lines) 64337c83711SBram Moolenaar set errorformat& 64437c83711SBram Moolenaarenddef 64537c83711SBram Moolenaar 646c9edd6b5SBram Moolenaardef Test_statusline_syntax() 647c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 648c9edd6b5SBram Moolenaar let lines =<< trim END 649c9edd6b5SBram Moolenaar vim9script 650c9edd6b5SBram Moolenaar func g:Status() 651c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 652c9edd6b5SBram Moolenaar endfunc 653c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 654c9edd6b5SBram Moolenaar redrawstatus 655c9edd6b5SBram Moolenaar set laststatus statusline= 656c9edd6b5SBram Moolenaar END 657c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 658c9edd6b5SBram Moolenaarenddef 659c9edd6b5SBram Moolenaar 660b209750bSBram Moolenaardef Test_list_vimscript() 661b209750bSBram Moolenaar # checks line continuation and comments 662b209750bSBram Moolenaar let lines =<< trim END 663b209750bSBram Moolenaar vim9script 664b209750bSBram Moolenaar let mylist = [ 665b209750bSBram Moolenaar 'one', 666b209750bSBram Moolenaar # comment 667b209750bSBram Moolenaar 'two', # empty line follows 668b209750bSBram Moolenaar 669b209750bSBram Moolenaar 'three', 670b209750bSBram Moolenaar ] 671b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 672b209750bSBram Moolenaar END 673b209750bSBram Moolenaar CheckScriptSuccess(lines) 67466250c93SBram Moolenaar 67566250c93SBram Moolenaar # check all lines from heredoc are kept 67666250c93SBram Moolenaar lines =<< trim END 67766250c93SBram Moolenaar # comment 1 67866250c93SBram Moolenaar two 67966250c93SBram Moolenaar # comment 3 68066250c93SBram Moolenaar 68166250c93SBram Moolenaar five 68266250c93SBram Moolenaar # comment 6 68366250c93SBram Moolenaar END 68466250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 685b209750bSBram Moolenaarenddef 686b209750bSBram Moolenaar 6872a1381c3SBram Moolenaarif has('channel') 68840ee466cSBram Moolenaar let someJob = test_null_job() 68940ee466cSBram Moolenaar 69040ee466cSBram Moolenaar def FuncWithError() 69140ee466cSBram Moolenaar echomsg g:someJob 69240ee466cSBram Moolenaar enddef 69340ee466cSBram Moolenaar 69440ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 69540ee466cSBram Moolenaar try 69640ee466cSBram Moolenaar call FuncWithError() 69740ee466cSBram Moolenaar catch 69840ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 69940ee466cSBram Moolenaar endtry 70040ee466cSBram Moolenaar endfunc 7012a1381c3SBram Moolenaarendif 70240ee466cSBram Moolenaar 7038a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 7048a7d6542SBram Moolenaar vim9script 7058a7d6542SBram Moolenaar let name: string = 'bob' 7068a7d6542SBram Moolenaar def Concat(arg: string): string 7078a7d6542SBram Moolenaar return name .. arg 7088a7d6542SBram Moolenaar enddef 709227a69deSBram Moolenaar g:result = Concat('bie') 710227a69deSBram Moolenaar g:localname = name 7118a7d6542SBram Moolenaar 7128a7d6542SBram Moolenaar export const CONST = 1234 7138a7d6542SBram Moolenaar export let exported = 9876 7146e587dcbSBram Moolenaar export let exp_name = 'John' 7158a7d6542SBram Moolenaar export def Exported(): string 7168a7d6542SBram Moolenaar return 'Exported' 7178a7d6542SBram Moolenaar enddef 7188a7d6542SBram MoolenaarEND 7198a7d6542SBram Moolenaar 720b3ca9824SBram Moolenaardef Undo_export_script_lines() 721b3ca9824SBram Moolenaar unlet g:result 722b3ca9824SBram Moolenaar unlet g:localname 723b3ca9824SBram Moolenaarenddef 724b3ca9824SBram Moolenaar 7255269bd2aSBram Moolenaardef Test_vim9_import_export() 7268a7d6542SBram Moolenaar let import_script_lines =<< trim END 7278a7d6542SBram Moolenaar vim9script 7288a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 7298a7d6542SBram Moolenaar g:imported = exported 7306e587dcbSBram Moolenaar exported += 3 7316e587dcbSBram Moolenaar g:imported_added = exported 7328a7d6542SBram Moolenaar g:imported_func = Exported() 7336e587dcbSBram Moolenaar 73440f4f7a4SBram Moolenaar def GetExported(): string 73540f4f7a4SBram Moolenaar let local_dict = #{ref: Exported} 73640f4f7a4SBram Moolenaar return local_dict.ref() 73740f4f7a4SBram Moolenaar enddef 73840f4f7a4SBram Moolenaar g:funcref_result = GetExported() 73940f4f7a4SBram Moolenaar 7406e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 7416e587dcbSBram Moolenaar g:imported_name = exp_name 7426e587dcbSBram Moolenaar exp_name ..= ' Doe' 7436e587dcbSBram Moolenaar g:imported_name_appended = exp_name 7445381c7a1SBram Moolenaar g:imported_later = exported 7458a7d6542SBram Moolenaar END 7468a7d6542SBram Moolenaar 7478a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 7488a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 7498a7d6542SBram Moolenaar 7508a7d6542SBram Moolenaar source Ximport.vim 7518a7d6542SBram Moolenaar 7528a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 7538a7d6542SBram Moolenaar assert_equal('bob', g:localname) 7548a7d6542SBram Moolenaar assert_equal(9876, g:imported) 7556e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 7565381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 7578a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 75840f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 7596e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 7606e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 7618a7d6542SBram Moolenaar assert_false(exists('g:name')) 7628a7d6542SBram Moolenaar 763b3ca9824SBram Moolenaar Undo_export_script_lines() 7648a7d6542SBram Moolenaar unlet g:imported 7656e587dcbSBram Moolenaar unlet g:imported_added 7665381c7a1SBram Moolenaar unlet g:imported_later 7678a7d6542SBram Moolenaar unlet g:imported_func 7686e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 7698a7d6542SBram Moolenaar delete('Ximport.vim') 770f2d5c240SBram Moolenaar 7711c991144SBram Moolenaar # similar, with line breaks 7721c991144SBram Moolenaar let import_line_break_script_lines =<< trim END 7731c991144SBram Moolenaar vim9script 7741c991144SBram Moolenaar import { 7751c991144SBram Moolenaar exported, 7761c991144SBram Moolenaar Exported, 7771c991144SBram Moolenaar } 7781c991144SBram Moolenaar from 7791c991144SBram Moolenaar './Xexport.vim' 7801c991144SBram Moolenaar g:imported = exported 7811c991144SBram Moolenaar exported += 5 7821c991144SBram Moolenaar g:imported_added = exported 7831c991144SBram Moolenaar g:imported_func = Exported() 7841c991144SBram Moolenaar END 7851c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 7861c991144SBram Moolenaar source Ximport_lbr.vim 7871c991144SBram Moolenaar 7881c991144SBram Moolenaar assert_equal(9876, g:imported) 7891c991144SBram Moolenaar assert_equal(9881, g:imported_added) 7901c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 7911c991144SBram Moolenaar 7921c991144SBram Moolenaar # exported script not sourced again 7931c991144SBram Moolenaar assert_false(exists('g:result')) 7941c991144SBram Moolenaar unlet g:imported 7951c991144SBram Moolenaar unlet g:imported_added 7961c991144SBram Moolenaar unlet g:imported_func 7971c991144SBram Moolenaar delete('Ximport_lbr.vim') 7981c991144SBram Moolenaar 7991c991144SBram Moolenaar # import inside :def function 8005381c7a1SBram Moolenaar let import_in_def_lines =<< trim END 8015381c7a1SBram Moolenaar vim9script 8025381c7a1SBram Moolenaar def ImportInDef() 8035381c7a1SBram Moolenaar import exported from './Xexport.vim' 8045381c7a1SBram Moolenaar g:imported = exported 8055381c7a1SBram Moolenaar exported += 7 8065381c7a1SBram Moolenaar g:imported_added = exported 8075381c7a1SBram Moolenaar enddef 8085381c7a1SBram Moolenaar ImportInDef() 8095381c7a1SBram Moolenaar END 8105381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 8115381c7a1SBram Moolenaar source Ximport2.vim 812f5be8cdbSBram Moolenaar # TODO: this should be 9879 8135381c7a1SBram Moolenaar assert_equal(9876, g:imported) 8145381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 8155381c7a1SBram Moolenaar unlet g:imported 8165381c7a1SBram Moolenaar unlet g:imported_added 8175381c7a1SBram Moolenaar delete('Ximport2.vim') 8185381c7a1SBram Moolenaar 819f2d5c240SBram Moolenaar let import_star_as_lines =<< trim END 820f2d5c240SBram Moolenaar vim9script 821f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 822f2d5c240SBram Moolenaar def UseExport() 823f2d5c240SBram Moolenaar g:imported = Export.exported 824f2d5c240SBram Moolenaar enddef 825f2d5c240SBram Moolenaar UseExport() 826f2d5c240SBram Moolenaar END 827f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 828f2d5c240SBram Moolenaar source Ximport.vim 8295381c7a1SBram Moolenaar assert_equal(9883, g:imported) 830f2d5c240SBram Moolenaar 831599c89c8SBram Moolenaar let import_star_as_lines_no_dot =<< trim END 832599c89c8SBram Moolenaar vim9script 833599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 834599c89c8SBram Moolenaar def Func() 835599c89c8SBram Moolenaar let dummy = 1 836599c89c8SBram Moolenaar let imported = Export + dummy 837599c89c8SBram Moolenaar enddef 838822ba247SBram Moolenaar defcompile 839599c89c8SBram Moolenaar END 840599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 84144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 842599c89c8SBram Moolenaar 843599c89c8SBram Moolenaar let import_star_as_lines_dot_space =<< trim END 844599c89c8SBram Moolenaar vim9script 845599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 846599c89c8SBram Moolenaar def Func() 847599c89c8SBram Moolenaar let imported = Export . exported 848599c89c8SBram Moolenaar enddef 849822ba247SBram Moolenaar defcompile 850599c89c8SBram Moolenaar END 851599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 85244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 853599c89c8SBram Moolenaar 854599c89c8SBram Moolenaar let import_star_as_lines_missing_name =<< trim END 855599c89c8SBram Moolenaar vim9script 856599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 857599c89c8SBram Moolenaar def Func() 858599c89c8SBram Moolenaar let imported = Export. 859599c89c8SBram Moolenaar enddef 860822ba247SBram Moolenaar defcompile 861599c89c8SBram Moolenaar END 862599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 86344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 864599c89c8SBram Moolenaar 8651c991144SBram Moolenaar let import_star_as_lbr_lines =<< trim END 8661c991144SBram Moolenaar vim9script 8671c991144SBram Moolenaar import * 8681c991144SBram Moolenaar as Export 8691c991144SBram Moolenaar from 8701c991144SBram Moolenaar './Xexport.vim' 8711c991144SBram Moolenaar def UseExport() 8721c991144SBram Moolenaar g:imported = Export.exported 8731c991144SBram Moolenaar enddef 8741c991144SBram Moolenaar UseExport() 8751c991144SBram Moolenaar END 8761c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 8771c991144SBram Moolenaar source Ximport.vim 8781c991144SBram Moolenaar assert_equal(9883, g:imported) 8791c991144SBram Moolenaar 880f2d5c240SBram Moolenaar let import_star_lines =<< trim END 881f2d5c240SBram Moolenaar vim9script 882f2d5c240SBram Moolenaar import * from './Xexport.vim' 883f2d5c240SBram Moolenaar END 884f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 88544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 886f2d5c240SBram Moolenaar 887f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 888fa29c8abSBram Moolenaar let import_not_exported_lines =<< trim END 889fa29c8abSBram Moolenaar vim9script 890fa29c8abSBram Moolenaar import name from './Xexport.vim' 891fa29c8abSBram Moolenaar END 892fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 89344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 894fa29c8abSBram Moolenaar 895f5be8cdbSBram Moolenaar # try to import something that is already defined 8965269bd2aSBram Moolenaar let import_already_defined =<< trim END 8975269bd2aSBram Moolenaar vim9script 8985269bd2aSBram Moolenaar let exported = 'something' 8995269bd2aSBram Moolenaar import exported from './Xexport.vim' 9005269bd2aSBram Moolenaar END 9015269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 90244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9035269bd2aSBram Moolenaar 904f5be8cdbSBram Moolenaar # try to import something that is already defined 9055269bd2aSBram Moolenaar import_already_defined =<< trim END 9065269bd2aSBram Moolenaar vim9script 9075269bd2aSBram Moolenaar let exported = 'something' 9085269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 9095269bd2aSBram Moolenaar END 9105269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 91144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9125269bd2aSBram Moolenaar 913f5be8cdbSBram Moolenaar # try to import something that is already defined 9145269bd2aSBram Moolenaar import_already_defined =<< trim END 9155269bd2aSBram Moolenaar vim9script 9165269bd2aSBram Moolenaar let exported = 'something' 9175269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 9185269bd2aSBram Moolenaar END 9195269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 92044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9215269bd2aSBram Moolenaar 922f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 923fa29c8abSBram Moolenaar let import_long_name_lines =<< trim END 924fa29c8abSBram Moolenaar vim9script 925fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 926fa29c8abSBram Moolenaar END 927fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 92844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 929fa29c8abSBram Moolenaar 930fa29c8abSBram Moolenaar let import_no_from_lines =<< trim END 931fa29c8abSBram Moolenaar vim9script 932fa29c8abSBram Moolenaar import name './Xexport.vim' 933fa29c8abSBram Moolenaar END 934fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 93544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 936fa29c8abSBram Moolenaar 937fa29c8abSBram Moolenaar let import_invalid_string_lines =<< trim END 938fa29c8abSBram Moolenaar vim9script 939fa29c8abSBram Moolenaar import name from Xexport.vim 940fa29c8abSBram Moolenaar END 941fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 94244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 943fa29c8abSBram Moolenaar 944fa29c8abSBram Moolenaar let import_wrong_name_lines =<< trim END 945fa29c8abSBram Moolenaar vim9script 946fa29c8abSBram Moolenaar import name from './XnoExport.vim' 947fa29c8abSBram Moolenaar END 948fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 94944d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 950fa29c8abSBram Moolenaar 951fa29c8abSBram Moolenaar let import_missing_comma_lines =<< trim END 952fa29c8abSBram Moolenaar vim9script 953fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 954fa29c8abSBram Moolenaar END 9555269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 95644d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 957fa29c8abSBram Moolenaar 958f2d5c240SBram Moolenaar delete('Ximport.vim') 9595269bd2aSBram Moolenaar delete('Ximport3.vim') 9608a7d6542SBram Moolenaar delete('Xexport.vim') 9618a7d6542SBram Moolenaar 962f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 963750802b5SBram Moolenaar set cpo&vi 964750802b5SBram Moolenaar let cpo_before = &cpo 965750802b5SBram Moolenaar let lines =<< trim END 966750802b5SBram Moolenaar vim9script 967750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 968750802b5SBram Moolenaar END 969750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 970750802b5SBram Moolenaar source Xvim9_script 971750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 972750802b5SBram Moolenaar set cpo&vim 973750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 974750802b5SBram Moolenaar delete('Xvim9_script') 975750802b5SBram Moolenaarenddef 976750802b5SBram Moolenaar 977803af686SBram Moolenaarfunc g:Trigger() 978803af686SBram Moolenaar source Ximport.vim 979803af686SBram Moolenaar return "echo 'yes'\<CR>" 980803af686SBram Moolenaarendfunc 981803af686SBram Moolenaar 982803af686SBram Moolenaardef Test_import_export_expr_map() 983803af686SBram Moolenaar # check that :import and :export work when buffer is locked 984803af686SBram Moolenaar let export_lines =<< trim END 985803af686SBram Moolenaar vim9script 986803af686SBram Moolenaar export def That(): string 987803af686SBram Moolenaar return 'yes' 988803af686SBram Moolenaar enddef 989803af686SBram Moolenaar END 990803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 991803af686SBram Moolenaar 992803af686SBram Moolenaar let import_lines =<< trim END 993803af686SBram Moolenaar vim9script 994803af686SBram Moolenaar import That from './Xexport_that.vim' 995803af686SBram Moolenaar assert_equal('yes', That()) 996803af686SBram Moolenaar END 997803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 998803af686SBram Moolenaar 999803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1000803af686SBram Moolenaar feedkeys('trigger', "xt") 1001803af686SBram Moolenaar 1002730b2483SBram Moolenaar delete('Xexport_that.vim') 1003803af686SBram Moolenaar delete('Ximport.vim') 1004803af686SBram Moolenaar nunmap trigger 1005803af686SBram Moolenaarenddef 1006803af686SBram Moolenaar 10078e1986e3SBram Moolenaardef Test_import_in_filetype() 10088e1986e3SBram Moolenaar # check that :import works when the buffer is locked 10098e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 10108e1986e3SBram Moolenaar let export_lines =<< trim END 10118e1986e3SBram Moolenaar vim9script 10128e1986e3SBram Moolenaar export let That = 'yes' 10138e1986e3SBram Moolenaar END 1014730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 10158e1986e3SBram Moolenaar 10168e1986e3SBram Moolenaar let import_lines =<< trim END 10178e1986e3SBram Moolenaar vim9script 1018730b2483SBram Moolenaar import That from './Xexport_ft.vim' 10198e1986e3SBram Moolenaar assert_equal('yes', That) 10208e1986e3SBram Moolenaar g:did_load_mytpe = 1 10218e1986e3SBram Moolenaar END 10228e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 10238e1986e3SBram Moolenaar 10248e1986e3SBram Moolenaar let save_rtp = &rtp 10258e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 10268e1986e3SBram Moolenaar 10278e1986e3SBram Moolenaar filetype plugin on 10288e1986e3SBram Moolenaar copen 10298e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 10308e1986e3SBram Moolenaar 10318e1986e3SBram Moolenaar quit! 1032730b2483SBram Moolenaar delete('Xexport_ft.vim') 10338e1986e3SBram Moolenaar delete('ftplugin', 'rf') 10348e1986e3SBram Moolenaar &rtp = save_rtp 10358e1986e3SBram Moolenaarenddef 10368e1986e3SBram Moolenaar 1037efa94447SBram Moolenaardef Test_use_import_in_mapping() 1038efa94447SBram Moolenaar let lines =<< trim END 1039efa94447SBram Moolenaar vim9script 1040efa94447SBram Moolenaar export def Funcx() 1041efa94447SBram Moolenaar g:result = 42 1042efa94447SBram Moolenaar enddef 1043efa94447SBram Moolenaar END 1044efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1045efa94447SBram Moolenaar lines =<< trim END 1046efa94447SBram Moolenaar vim9script 1047efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1048b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1049efa94447SBram Moolenaar END 1050efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1051efa94447SBram Moolenaar 1052efa94447SBram Moolenaar source Xmapscript.vim 1053b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1054efa94447SBram Moolenaar assert_equal(42, g:result) 1055efa94447SBram Moolenaar 1056efa94447SBram Moolenaar unlet g:result 1057efa94447SBram Moolenaar delete('XsomeExport.vim') 1058efa94447SBram Moolenaar delete('Xmapscript.vim') 1059b3ca9824SBram Moolenaar nunmap <F3> 1060efa94447SBram Moolenaarenddef 1061efa94447SBram Moolenaar 1062750802b5SBram Moolenaardef Test_vim9script_fails() 10638a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 10648a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1065750802b5SBram Moolenaar CheckScriptFailure(['export let some = 123'], 'E1042:') 10669721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 10679b7bf9e9SBram Moolenaar CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:') 1068750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1069750802b5SBram Moolenaar 1070451c2e35SBram Moolenaar CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1012:') 1071c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1072c785b9a7SBram Moolenaar 1073e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1074e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 10758a7d6542SBram Moolenaarenddef 10768a7d6542SBram Moolenaar 1077f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1078101f4810SBram Moolenaar CheckRunVimInTerminal 1079101f4810SBram Moolenaar 10809bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1081c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 10829bb3eb3eSBram Moolenaarendfunc 10839bb3eb3eSBram Moolenaar 1084c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1085101f4810SBram Moolenaar let export =<< trim END 1086101f4810SBram Moolenaar vim9script 1087101f4810SBram Moolenaar export def Foo(): number 1088101f4810SBram Moolenaar return 0 1089101f4810SBram Moolenaar enddef 1090101f4810SBram Moolenaar END 1091730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1092101f4810SBram Moolenaar 1093730b2483SBram Moolenaar let buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 10949bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 10959bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1096101f4810SBram Moolenaar 1097730b2483SBram Moolenaar delete('XexportCmd.vim') 10989bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 10999bb3eb3eSBram Moolenaarenddef 1100101f4810SBram Moolenaar 11014c17ad94SBram Moolenaardef Test_vim9script_reload_import() 11028a7d6542SBram Moolenaar let lines =<< trim END 11038a7d6542SBram Moolenaar vim9script 11048a7d6542SBram Moolenaar const var = '' 11058a7d6542SBram Moolenaar let valone = 1234 11068a7d6542SBram Moolenaar def MyFunc(arg: string) 11078a7d6542SBram Moolenaar valone = 5678 11088a7d6542SBram Moolenaar enddef 11098a7d6542SBram Moolenaar END 11108a7d6542SBram Moolenaar let morelines =<< trim END 11118a7d6542SBram Moolenaar let valtwo = 222 11128a7d6542SBram Moolenaar export def GetValtwo(): number 11138a7d6542SBram Moolenaar return valtwo 11148a7d6542SBram Moolenaar enddef 11158a7d6542SBram Moolenaar END 111603afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 11178a7d6542SBram Moolenaar source Xreload.vim 11188a7d6542SBram Moolenaar source Xreload.vim 11198a7d6542SBram Moolenaar source Xreload.vim 11208a7d6542SBram Moolenaar 11218a7d6542SBram Moolenaar let testlines =<< trim END 11228a7d6542SBram Moolenaar vim9script 11238a7d6542SBram Moolenaar def TheFunc() 11248a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 11258a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 11268a7d6542SBram Moolenaar enddef 11278a7d6542SBram Moolenaar TheFunc() 11288a7d6542SBram Moolenaar END 11298a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 11308a7d6542SBram Moolenaar source Ximport.vim 11318a7d6542SBram Moolenaar 1132f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1133f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 11348a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11358a7d6542SBram Moolenaar source Ximport.vim 11368a7d6542SBram Moolenaar 1137f5be8cdbSBram Moolenaar # cannot declare a var twice 11388a7d6542SBram Moolenaar lines =<< trim END 11398a7d6542SBram Moolenaar vim9script 11408a7d6542SBram Moolenaar let valone = 1234 11418a7d6542SBram Moolenaar let valone = 5678 11428a7d6542SBram Moolenaar END 11438a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 114444d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 11458a7d6542SBram Moolenaar 11468a7d6542SBram Moolenaar delete('Xreload.vim') 11478a7d6542SBram Moolenaar delete('Ximport.vim') 11488a7d6542SBram Moolenaarenddef 11498a7d6542SBram Moolenaar 115095006e3dSBram Moolenaardef s:RetSome(): string 115195006e3dSBram Moolenaar return 'some' 115295006e3dSBram Moolenaarenddef 115395006e3dSBram Moolenaar 1154fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1155fe465a01SBram Moolenaar" script-local name. 1156fe465a01SBram Moolenaardef Test_vim9script_funcref() 1157fe465a01SBram Moolenaar let sortlines =<< trim END 1158fe465a01SBram Moolenaar vim9script 1159fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1160bed36b93SBram Moolenaar return i2 - i1 1161fe465a01SBram Moolenaar enddef 1162fe465a01SBram Moolenaar 1163fe465a01SBram Moolenaar export def FastSort(): list<number> 1164fe465a01SBram Moolenaar return range(5)->sort(Compare) 1165fe465a01SBram Moolenaar enddef 1166fe465a01SBram Moolenaar END 1167fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1168fe465a01SBram Moolenaar 1169fe465a01SBram Moolenaar let lines =<< trim END 1170fe465a01SBram Moolenaar vim9script 1171fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1172fe465a01SBram Moolenaar def Test() 1173fe465a01SBram Moolenaar g:result = FastSort() 1174fe465a01SBram Moolenaar enddef 1175fe465a01SBram Moolenaar Test() 1176fe465a01SBram Moolenaar END 1177fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1178fe465a01SBram Moolenaar 1179fe465a01SBram Moolenaar source Xscript.vim 1180fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1181fe465a01SBram Moolenaar 1182fe465a01SBram Moolenaar unlet g:result 1183fe465a01SBram Moolenaar delete('Xsort.vim') 1184fe465a01SBram Moolenaar delete('Xscript.vim') 118595006e3dSBram Moolenaar 118695006e3dSBram Moolenaar let Funcref = function('s:RetSome') 118795006e3dSBram Moolenaar assert_equal('some', Funcref()) 1188fe465a01SBram Moolenaarenddef 1189fe465a01SBram Moolenaar 1190601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1191601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1192601e76acSBram Moolenaar" function reference. 1193c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1194c620c055SBram Moolenaar let filterLines =<< trim END 1195c620c055SBram Moolenaar vim9script 1196c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1197c620c055SBram Moolenaar return idx % 2 == 1 1198c620c055SBram Moolenaar enddef 1199c620c055SBram Moolenaar export def FastFilter(): list<number> 1200c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1201c620c055SBram Moolenaar enddef 1202601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1203601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1204601e76acSBram Moolenaar enddef 1205c620c055SBram Moolenaar END 1206c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1207c620c055SBram Moolenaar 1208c620c055SBram Moolenaar let lines =<< trim END 1209c620c055SBram Moolenaar vim9script 1210601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1211c620c055SBram Moolenaar def Test() 1212c620c055SBram Moolenaar let x: list<number> = FastFilter() 1213c620c055SBram Moolenaar enddef 1214c620c055SBram Moolenaar Test() 1215601e76acSBram Moolenaar def TestDirect() 1216601e76acSBram Moolenaar let x: list<number> = FastFilterDirect() 1217601e76acSBram Moolenaar enddef 1218601e76acSBram Moolenaar TestDirect() 1219c620c055SBram Moolenaar END 1220601e76acSBram Moolenaar CheckScriptSuccess(lines) 1221c620c055SBram Moolenaar delete('Xfilter.vim') 1222c620c055SBram Moolenaarenddef 1223c620c055SBram Moolenaar 12244c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 12254c17ad94SBram Moolenaar let first_lines =<< trim END 12264c17ad94SBram Moolenaar vim9script 12274c17ad94SBram Moolenaar def FuncYes(): string 12284c17ad94SBram Moolenaar return 'yes' 12294c17ad94SBram Moolenaar enddef 12304c17ad94SBram Moolenaar END 123103afdcf1SBram Moolenaar let withno_lines =<< trim END 12324c17ad94SBram Moolenaar def FuncNo(): string 12334c17ad94SBram Moolenaar return 'no' 12344c17ad94SBram Moolenaar enddef 12354c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 12364c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 12374c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 123803afdcf1SBram Moolenaar enddef 123903afdcf1SBram Moolenaar END 124003afdcf1SBram Moolenaar let nono_lines =<< trim END 124103afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 124203afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 124344d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 12444c17ad94SBram Moolenaar enddef 12454c17ad94SBram Moolenaar END 12464c17ad94SBram Moolenaar 12474c17ad94SBram Moolenaar # FuncNo() is defined 124803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12494c17ad94SBram Moolenaar source Xreloaded.vim 12504c17ad94SBram Moolenaar g:DoCheck(true) 12514c17ad94SBram Moolenaar 12524c17ad94SBram Moolenaar # FuncNo() is not redefined 125303afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 12544c17ad94SBram Moolenaar source Xreloaded.vim 125503afdcf1SBram Moolenaar g:DoCheck() 12564c17ad94SBram Moolenaar 12574c17ad94SBram Moolenaar # FuncNo() is back 125803afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12594c17ad94SBram Moolenaar source Xreloaded.vim 126003afdcf1SBram Moolenaar g:DoCheck() 12614c17ad94SBram Moolenaar 12624c17ad94SBram Moolenaar delete('Xreloaded.vim') 12634c17ad94SBram Moolenaarenddef 12644c17ad94SBram Moolenaar 126589483d40SBram Moolenaardef Test_vim9script_reload_delvar() 126689483d40SBram Moolenaar # write the script with a script-local variable 126789483d40SBram Moolenaar let lines =<< trim END 126889483d40SBram Moolenaar vim9script 126989483d40SBram Moolenaar let var = 'string' 127089483d40SBram Moolenaar END 127189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 127289483d40SBram Moolenaar source XreloadVar.vim 127389483d40SBram Moolenaar 127489483d40SBram Moolenaar # now write the script using the same variable locally - works 127589483d40SBram Moolenaar lines =<< trim END 127689483d40SBram Moolenaar vim9script 127789483d40SBram Moolenaar def Func() 127889483d40SBram Moolenaar let var = 'string' 127989483d40SBram Moolenaar enddef 128089483d40SBram Moolenaar END 128189483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 128289483d40SBram Moolenaar source XreloadVar.vim 128389483d40SBram Moolenaar 128489483d40SBram Moolenaar delete('XreloadVar.vim') 128589483d40SBram Moolenaarenddef 128689483d40SBram Moolenaar 12878a7d6542SBram Moolenaardef Test_import_absolute() 12888a7d6542SBram Moolenaar let import_lines = [ 1289e6085c53SBram Moolenaar 'vim9script', 1290e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1291e6085c53SBram Moolenaar 'def UseExported()', 1292e6085c53SBram Moolenaar ' g:imported_abs = exported', 1293e6085c53SBram Moolenaar ' exported = 8888', 1294e6085c53SBram Moolenaar ' g:imported_after = exported', 1295e6085c53SBram Moolenaar 'enddef', 1296e6085c53SBram Moolenaar 'UseExported()', 1297e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1298e6085c53SBram Moolenaar ] 12998a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 13008a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 13018a7d6542SBram Moolenaar 13028a7d6542SBram Moolenaar source Ximport_abs.vim 13038a7d6542SBram Moolenaar 13048a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 13054e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1306675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1307675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1308675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1309675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1310675f716eSBram Moolenaar 'exported = 8888.*' .. 1311675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1312675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1313675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1314675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1315e6085c53SBram Moolenaar g:import_disassembled) 1316b3ca9824SBram Moolenaar 1317b3ca9824SBram Moolenaar Undo_export_script_lines() 13188a7d6542SBram Moolenaar unlet g:imported_abs 13194e12a5dfSBram Moolenaar unlet g:import_disassembled 13208a7d6542SBram Moolenaar 13218a7d6542SBram Moolenaar delete('Ximport_abs.vim') 13228a7d6542SBram Moolenaar delete('Xexport_abs.vim') 13238a7d6542SBram Moolenaarenddef 13248a7d6542SBram Moolenaar 13258a7d6542SBram Moolenaardef Test_import_rtp() 13268a7d6542SBram Moolenaar let import_lines = [ 1327e6085c53SBram Moolenaar 'vim9script', 1328e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1329e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1330e6085c53SBram Moolenaar ] 13318a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 13328a7d6542SBram Moolenaar mkdir('import') 13338a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 13348a7d6542SBram Moolenaar 13358a7d6542SBram Moolenaar let save_rtp = &rtp 13368a7d6542SBram Moolenaar &rtp = getcwd() 13378a7d6542SBram Moolenaar source Ximport_rtp.vim 13388a7d6542SBram Moolenaar &rtp = save_rtp 13398a7d6542SBram Moolenaar 13408a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 13418a7d6542SBram Moolenaar 1342b3ca9824SBram Moolenaar Undo_export_script_lines() 1343b3ca9824SBram Moolenaar unlet g:imported_rtp 13448a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 134589483d40SBram Moolenaar delete('import', 'rf') 13468a7d6542SBram Moolenaarenddef 13478a7d6542SBram Moolenaar 134825e0f586SBram Moolenaardef Test_import_compile_error() 134925e0f586SBram Moolenaar let export_lines = [ 135025e0f586SBram Moolenaar 'vim9script', 135125e0f586SBram Moolenaar 'export def ExpFunc(): string', 135225e0f586SBram Moolenaar ' return notDefined', 135325e0f586SBram Moolenaar 'enddef', 135425e0f586SBram Moolenaar ] 135525e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 135625e0f586SBram Moolenaar 135725e0f586SBram Moolenaar let import_lines = [ 135825e0f586SBram Moolenaar 'vim9script', 135925e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 136025e0f586SBram Moolenaar 'def ImpFunc()', 136125e0f586SBram Moolenaar ' echo ExpFunc()', 136225e0f586SBram Moolenaar 'enddef', 136325e0f586SBram Moolenaar 'defcompile', 136425e0f586SBram Moolenaar ] 136525e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 136625e0f586SBram Moolenaar 136725e0f586SBram Moolenaar try 136825e0f586SBram Moolenaar source Ximport.vim 136925e0f586SBram Moolenaar catch /E1001/ 1370f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 13717707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 137225e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 137325e0f586SBram Moolenaar endtry 137425e0f586SBram Moolenaar 137525e0f586SBram Moolenaar delete('Xexported.vim') 137625e0f586SBram Moolenaar delete('Ximport.vim') 137725e0f586SBram Moolenaarenddef 137825e0f586SBram Moolenaar 1379c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1380c4ce36d4SBram Moolenaar let lines = [ 1381c4ce36d4SBram Moolenaar 'vim9script', 1382c4ce36d4SBram Moolenaar 'def Func()', 1383c4ce36d4SBram Moolenaar ' eval [][0]', 1384c4ce36d4SBram Moolenaar 'enddef', 1385c4ce36d4SBram Moolenaar 'Func()', 1386c4ce36d4SBram Moolenaar ] 1387c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1388c4ce36d4SBram Moolenaar 1389c4ce36d4SBram Moolenaar for count in range(3) 1390c4ce36d4SBram Moolenaar try 1391c4ce36d4SBram Moolenaar source Xtestscript.vim 1392c4ce36d4SBram Moolenaar catch /E684/ 1393c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1394c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1395c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1396c4ce36d4SBram Moolenaar endtry 1397c4ce36d4SBram Moolenaar endfor 1398c4ce36d4SBram Moolenaar 1399c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1400c4ce36d4SBram Moolenaarenddef 1401c4ce36d4SBram Moolenaar 1402eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1403eef2102eSBram Moolenaar let export_lines =<< trim END 1404eef2102eSBram Moolenaar vim9script 1405eef2102eSBram Moolenaar export def Func() 1406eef2102eSBram Moolenaar echo 'imported' 1407eef2102eSBram Moolenaar enddef 1408eef2102eSBram Moolenaar END 1409eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1410eef2102eSBram Moolenaar 1411eef2102eSBram Moolenaar let lines =<< trim END 1412eef2102eSBram Moolenaar vim9script 1413eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1414eef2102eSBram Moolenaar def Func() 1415eef2102eSBram Moolenaar echo 'local to function' 1416eef2102eSBram Moolenaar enddef 1417eef2102eSBram Moolenaar END 1418eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1419eef2102eSBram Moolenaar 1420eef2102eSBram Moolenaar lines =<< trim END 1421eef2102eSBram Moolenaar vim9script 1422eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1423eef2102eSBram Moolenaar def Outer() 1424eef2102eSBram Moolenaar def Func() 1425eef2102eSBram Moolenaar echo 'local to function' 1426eef2102eSBram Moolenaar enddef 1427eef2102eSBram Moolenaar enddef 1428eef2102eSBram Moolenaar defcompile 1429eef2102eSBram Moolenaar END 1430eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1431eef2102eSBram Moolenaar 1432eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1433eef2102eSBram Moolenaarenddef 1434eef2102eSBram Moolenaar 1435b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1436b9a2cac3SBram Moolenaar let lines =<< trim END 1437b9a2cac3SBram Moolenaar vim9script 1438b9a2cac3SBram Moolenaar def Func() 1439b9a2cac3SBram Moolenaar echo 'one' 1440b9a2cac3SBram Moolenaar enddef 1441b9a2cac3SBram Moolenaar def Func() 1442b9a2cac3SBram Moolenaar echo 'two' 1443b9a2cac3SBram Moolenaar enddef 1444b9a2cac3SBram Moolenaar END 1445b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1446fa211f3cSBram Moolenaar 1447fa211f3cSBram Moolenaar lines =<< trim END 1448fa211f3cSBram Moolenaar vim9script 1449fa211f3cSBram Moolenaar def Foo(): string 1450fa211f3cSBram Moolenaar return 'foo' 1451fa211f3cSBram Moolenaar enddef 1452fa211f3cSBram Moolenaar def Func() 1453fa211f3cSBram Moolenaar let Foo = {-> 'lambda'} 1454fa211f3cSBram Moolenaar enddef 1455fa211f3cSBram Moolenaar defcompile 1456fa211f3cSBram Moolenaar END 1457fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1458b9a2cac3SBram Moolenaarenddef 1459b9a2cac3SBram Moolenaar 14608a7d6542SBram Moolenaardef Test_fixed_size_list() 1461f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 14628a7d6542SBram Moolenaar let l = [1, 2, 3, 4] 14638a7d6542SBram Moolenaar l->remove(0) 14648a7d6542SBram Moolenaar l->add(5) 14658a7d6542SBram Moolenaar l->insert(99, 1) 14660f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 14678a7d6542SBram Moolenaarenddef 14688a7d6542SBram Moolenaar 1469ae616494SBram Moolenaardef Test_no_insert_xit() 1470d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1471d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1472d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1473d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1474d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1475ae616494SBram Moolenaar 1476ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1477ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1478ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1479ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1480f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1481f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1482f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1483f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1484f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1485ae616494SBram Moolenaarenddef 1486ae616494SBram Moolenaar 1487158906cfSBram Moolenaardef IfElse(what: number): string 1488158906cfSBram Moolenaar let res = '' 1489158906cfSBram Moolenaar if what == 1 1490158906cfSBram Moolenaar res = "one" 1491158906cfSBram Moolenaar elseif what == 2 1492158906cfSBram Moolenaar res = "two" 1493a259d8d3SBram Moolenaar else 1494158906cfSBram Moolenaar res = "three" 1495a259d8d3SBram Moolenaar endif 1496158906cfSBram Moolenaar return res 1497a259d8d3SBram Moolenaarenddef 1498a259d8d3SBram Moolenaar 1499158906cfSBram Moolenaardef Test_if_elseif_else() 1500158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1501158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1502158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 15030f18b6d1SBram Moolenaarenddef 15040f18b6d1SBram Moolenaar 1505e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1506d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1507d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1508d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1509d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1510d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 1511e8c4abbbSBram Moolenaarenddef 1512e8c4abbbSBram Moolenaar 15136d69bf60SBram Moolenaarlet g:bool_true = v:true 15146d69bf60SBram Moolenaarlet g:bool_false = v:false 15156d69bf60SBram Moolenaar 15166d69bf60SBram Moolenaardef Test_if_const_expr() 15176d69bf60SBram Moolenaar let res = false 15186d69bf60SBram Moolenaar if true ? true : false 15196d69bf60SBram Moolenaar res = true 15206d69bf60SBram Moolenaar endif 15216d69bf60SBram Moolenaar assert_equal(true, res) 15226d69bf60SBram Moolenaar 1523585fea7bSBram Moolenaar g:glob = 2 1524585fea7bSBram Moolenaar if false 15256797966dSBram Moolenaar execute('g:glob = 3') 1526585fea7bSBram Moolenaar endif 1527585fea7bSBram Moolenaar assert_equal(2, g:glob) 1528585fea7bSBram Moolenaar if true 15296797966dSBram Moolenaar execute('g:glob = 3') 1530585fea7bSBram Moolenaar endif 1531585fea7bSBram Moolenaar assert_equal(3, g:glob) 1532585fea7bSBram Moolenaar 15336d69bf60SBram Moolenaar res = false 15346d69bf60SBram Moolenaar if g:bool_true ? true : false 15356d69bf60SBram Moolenaar res = true 15366d69bf60SBram Moolenaar endif 15376d69bf60SBram Moolenaar assert_equal(true, res) 15386d69bf60SBram Moolenaar 15396d69bf60SBram Moolenaar res = false 15406d69bf60SBram Moolenaar if true ? g:bool_true : false 15416d69bf60SBram Moolenaar res = true 15426d69bf60SBram Moolenaar endif 15436d69bf60SBram Moolenaar assert_equal(true, res) 15446d69bf60SBram Moolenaar 15456d69bf60SBram Moolenaar res = false 15466d69bf60SBram Moolenaar if true ? true : g:bool_false 15476d69bf60SBram Moolenaar res = true 15486d69bf60SBram Moolenaar endif 15496d69bf60SBram Moolenaar assert_equal(true, res) 15506d69bf60SBram Moolenaar 15516d69bf60SBram Moolenaar res = false 15526d69bf60SBram Moolenaar if true ? false : true 15536d69bf60SBram Moolenaar res = true 15546d69bf60SBram Moolenaar endif 15556d69bf60SBram Moolenaar assert_equal(false, res) 15566d69bf60SBram Moolenaar 15576d69bf60SBram Moolenaar res = false 15586d69bf60SBram Moolenaar if false ? false : true 15596d69bf60SBram Moolenaar res = true 15606d69bf60SBram Moolenaar endif 15616d69bf60SBram Moolenaar assert_equal(true, res) 15626d69bf60SBram Moolenaar 15636d69bf60SBram Moolenaar res = false 15646d69bf60SBram Moolenaar if false ? true : false 15656d69bf60SBram Moolenaar res = true 15666d69bf60SBram Moolenaar endif 15676d69bf60SBram Moolenaar assert_equal(false, res) 15686d69bf60SBram Moolenaar 15696d69bf60SBram Moolenaar res = false 1570e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1571e8c4abbbSBram Moolenaar res = true 1572e8c4abbbSBram Moolenaar endif 1573e8c4abbbSBram Moolenaar assert_equal(false, res) 1574e8c4abbbSBram Moolenaar 1575e8c4abbbSBram Moolenaar res = false 15766d69bf60SBram Moolenaar if true && true 15776d69bf60SBram Moolenaar res = true 15786d69bf60SBram Moolenaar endif 15796d69bf60SBram Moolenaar assert_equal(true, res) 15806d69bf60SBram Moolenaar 15816d69bf60SBram Moolenaar res = false 15826d69bf60SBram Moolenaar if true && false 15836d69bf60SBram Moolenaar res = true 15846d69bf60SBram Moolenaar endif 15856d69bf60SBram Moolenaar assert_equal(false, res) 15866d69bf60SBram Moolenaar 15876d69bf60SBram Moolenaar res = false 15886d69bf60SBram Moolenaar if g:bool_true && false 15896d69bf60SBram Moolenaar res = true 15906d69bf60SBram Moolenaar endif 15916d69bf60SBram Moolenaar assert_equal(false, res) 15926d69bf60SBram Moolenaar 15936d69bf60SBram Moolenaar res = false 15946d69bf60SBram Moolenaar if true && g:bool_false 15956d69bf60SBram Moolenaar res = true 15966d69bf60SBram Moolenaar endif 15976d69bf60SBram Moolenaar assert_equal(false, res) 15986d69bf60SBram Moolenaar 15996d69bf60SBram Moolenaar res = false 16006d69bf60SBram Moolenaar if false && false 16016d69bf60SBram Moolenaar res = true 16026d69bf60SBram Moolenaar endif 16036d69bf60SBram Moolenaar assert_equal(false, res) 16046d69bf60SBram Moolenaar 16056d69bf60SBram Moolenaar res = false 16066d69bf60SBram Moolenaar if true || false 16076d69bf60SBram Moolenaar res = true 16086d69bf60SBram Moolenaar endif 16096d69bf60SBram Moolenaar assert_equal(true, res) 16106d69bf60SBram Moolenaar 16116d69bf60SBram Moolenaar res = false 16126d69bf60SBram Moolenaar if g:bool_true || false 16136d69bf60SBram Moolenaar res = true 16146d69bf60SBram Moolenaar endif 16156d69bf60SBram Moolenaar assert_equal(true, res) 16166d69bf60SBram Moolenaar 16176d69bf60SBram Moolenaar res = false 16186d69bf60SBram Moolenaar if true || g:bool_false 16196d69bf60SBram Moolenaar res = true 16206d69bf60SBram Moolenaar endif 16216d69bf60SBram Moolenaar assert_equal(true, res) 16226d69bf60SBram Moolenaar 16236d69bf60SBram Moolenaar res = false 16246d69bf60SBram Moolenaar if false || false 16256d69bf60SBram Moolenaar res = true 16266d69bf60SBram Moolenaar endif 16276d69bf60SBram Moolenaar assert_equal(false, res) 16283988f64fSBram Moolenaar 16293988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 16303988f64fSBram Moolenaar if false | eval 0 | endif 16313988f64fSBram Moolenaar if false | eval burp + 234 | endif 16323988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 16333988f64fSBram Moolenaar if false 16343988f64fSBram Moolenaar burp 16353988f64fSBram Moolenaar endif 163680c34ca3SBram Moolenaarenddef 16376d69bf60SBram Moolenaar 163880c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1639d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1640d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1641d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1642d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 16436d69bf60SBram Moolenaarenddef 16446d69bf60SBram Moolenaar 164572abcf42SBram Moolenaardef RunNested(i: number): number 164672abcf42SBram Moolenaar let x: number = 0 164772abcf42SBram Moolenaar if i % 2 164872abcf42SBram Moolenaar if 1 1649f5be8cdbSBram Moolenaar # comment 165072abcf42SBram Moolenaar else 1651f5be8cdbSBram Moolenaar # comment 165272abcf42SBram Moolenaar endif 165372abcf42SBram Moolenaar x += 1 165472abcf42SBram Moolenaar else 165572abcf42SBram Moolenaar x += 1000 165672abcf42SBram Moolenaar endif 165772abcf42SBram Moolenaar return x 165872abcf42SBram Moolenaarenddef 165972abcf42SBram Moolenaar 166072abcf42SBram Moolenaardef Test_nested_if() 166172abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 166272abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 166372abcf42SBram Moolenaarenddef 166472abcf42SBram Moolenaar 1665ad39c094SBram Moolenaardef Test_execute_cmd() 1666ad39c094SBram Moolenaar new 1667ad39c094SBram Moolenaar setline(1, 'default') 1668d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1669ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1670a72cfb80SBram Moolenaar 1671d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1672a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1673a72cfb80SBram Moolenaar 1674d2c61705SBram Moolenaar let cmd1 = 'setline(1,' 1675ad39c094SBram Moolenaar let cmd2 = '"execute-var")' 1676a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1677ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1678a72cfb80SBram Moolenaar 1679d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1680ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1681a72cfb80SBram Moolenaar 1682ad39c094SBram Moolenaar let cmd_first = 'call ' 1683ad39c094SBram Moolenaar let cmd_last = 'setline(1, "execute-var-var")' 1684ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1685ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1686ad39c094SBram Moolenaar bwipe! 1687585fea7bSBram Moolenaar 16882d6b20d6SBram Moolenaar let n = true 16892d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 16902d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 16912d6b20d6SBram Moolenaar 1692e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 1693e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1694e5abf7afSBram Moolenaar 1695d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1696d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1697d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1698ad39c094SBram Moolenaarenddef 1699ad39c094SBram Moolenaar 170047e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1701f5be8cdbSBram Moolenaar # only checks line continuation 170247e880d6SBram Moolenaar let lines =<< trim END 170347e880d6SBram Moolenaar vim9script 170447e880d6SBram Moolenaar execute 'g:someVar' 170547e880d6SBram Moolenaar .. ' = ' .. 170647e880d6SBram Moolenaar '28' 170747e880d6SBram Moolenaar assert_equal(28, g:someVar) 170847e880d6SBram Moolenaar unlet g:someVar 170947e880d6SBram Moolenaar END 171047e880d6SBram Moolenaar CheckScriptSuccess(lines) 171147e880d6SBram Moolenaarenddef 171247e880d6SBram Moolenaar 1713ad39c094SBram Moolenaardef Test_echo_cmd() 1714a72cfb80SBram Moolenaar echo 'some' # comment 1715585fea7bSBram Moolenaar echon 'thing' 1716ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1717ad39c094SBram Moolenaar 1718a72cfb80SBram Moolenaar echo "some" # comment 1719a72cfb80SBram Moolenaar echon "thing" 1720a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1721a72cfb80SBram Moolenaar 1722ad39c094SBram Moolenaar let str1 = 'some' 1723ad39c094SBram Moolenaar let str2 = 'more' 1724ad39c094SBram Moolenaar echo str1 str2 1725ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1726a72cfb80SBram Moolenaar 1727d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1728ad39c094SBram Moolenaarenddef 1729ad39c094SBram Moolenaar 1730f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1731f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1732f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1733f93c7feaSBram Moolenaar echo 'clear' 1734df069eecSBram Moolenaar :1messages 1735f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1736f93c7feaSBram Moolenaar 1737d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1738f93c7feaSBram Moolenaarenddef 1739f93c7feaSBram Moolenaar 174047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1741f5be8cdbSBram Moolenaar # only checks line continuation 174247e880d6SBram Moolenaar let lines =<< trim END 174347e880d6SBram Moolenaar vim9script 174447e880d6SBram Moolenaar echomsg 'here' 174547e880d6SBram Moolenaar .. ' is ' .. 174647e880d6SBram Moolenaar 'a message' 174747e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 174847e880d6SBram Moolenaar END 174947e880d6SBram Moolenaar CheckScriptSuccess(lines) 175047e880d6SBram Moolenaarenddef 175147e880d6SBram Moolenaar 1752f93c7feaSBram Moolenaardef Test_echoerr_cmd() 175340ee466cSBram Moolenaar try 175440ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 175540ee466cSBram Moolenaar catch 175640ee466cSBram Moolenaar assert_match('something wrong', v:exception) 175740ee466cSBram Moolenaar endtry 1758f93c7feaSBram Moolenaarenddef 1759f93c7feaSBram Moolenaar 176047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1761f5be8cdbSBram Moolenaar # only checks line continuation 176247e880d6SBram Moolenaar let lines =<< trim END 176347e880d6SBram Moolenaar vim9script 176447e880d6SBram Moolenaar try 176547e880d6SBram Moolenaar echoerr 'this' 176647e880d6SBram Moolenaar .. ' is ' .. 176747e880d6SBram Moolenaar 'wrong' 176847e880d6SBram Moolenaar catch 176947e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 177047e880d6SBram Moolenaar endtry 177147e880d6SBram Moolenaar END 177247e880d6SBram Moolenaar CheckScriptSuccess(lines) 177347e880d6SBram Moolenaarenddef 177447e880d6SBram Moolenaar 177541fe0617SBram Moolenaardef Test_for_outside_of_function() 177641fe0617SBram Moolenaar let lines =<< trim END 177741fe0617SBram Moolenaar vim9script 177841fe0617SBram Moolenaar new 177941fe0617SBram Moolenaar for var in range(0, 3) 178041fe0617SBram Moolenaar append(line('$'), var) 178141fe0617SBram Moolenaar endfor 178241fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 178341fe0617SBram Moolenaar bwipe! 178441fe0617SBram Moolenaar END 178541fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 178641fe0617SBram Moolenaar source Xvim9for.vim 178741fe0617SBram Moolenaar delete('Xvim9for.vim') 178841fe0617SBram Moolenaarenddef 17898a7d6542SBram Moolenaar 1790e8c4abbbSBram Moolenaardef Test_for_loop() 1791e8c4abbbSBram Moolenaar let result = '' 1792e8c4abbbSBram Moolenaar for cnt in range(7) 1793e8c4abbbSBram Moolenaar if cnt == 4 1794e8c4abbbSBram Moolenaar break 1795e8c4abbbSBram Moolenaar endif 1796e8c4abbbSBram Moolenaar if cnt == 2 1797e8c4abbbSBram Moolenaar continue 1798e8c4abbbSBram Moolenaar endif 1799e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1800e8c4abbbSBram Moolenaar endfor 1801e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 18020ad3e894SBram Moolenaar 18030ad3e894SBram Moolenaar let concat = '' 18040ad3e894SBram Moolenaar for str in eval('["one", "two"]') 18050ad3e894SBram Moolenaar concat ..= str 18060ad3e894SBram Moolenaar endfor 18070ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1808e8c4abbbSBram Moolenaarenddef 1809e8c4abbbSBram Moolenaar 1810e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1811675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1812675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1813451c2e35SBram Moolenaar CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1017:') 1814822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 1815451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 1816675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1817675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1818675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1819e8c4abbbSBram Moolenaarenddef 1820e8c4abbbSBram Moolenaar 1821d0df1aacSBram Moolenaardef Test_while_loop() 1822d0df1aacSBram Moolenaar let result = '' 1823d0df1aacSBram Moolenaar let cnt = 0 1824d0df1aacSBram Moolenaar while cnt < 555 1825d0df1aacSBram Moolenaar if cnt == 3 1826d0df1aacSBram Moolenaar break 1827d0df1aacSBram Moolenaar endif 1828d0df1aacSBram Moolenaar cnt += 1 1829d0df1aacSBram Moolenaar if cnt == 2 1830d0df1aacSBram Moolenaar continue 1831d0df1aacSBram Moolenaar endif 1832d0df1aacSBram Moolenaar result ..= cnt .. '_' 1833d0df1aacSBram Moolenaar endwhile 1834d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1835d0df1aacSBram Moolenaarenddef 1836d0df1aacSBram Moolenaar 1837e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1838675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1839675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1840675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1841675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1842675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1843675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1844675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1845bd5da371SBram Moolenaarenddef 1846bd5da371SBram Moolenaar 18479645e2d9SBram Moolenaardef Test_interrupt_loop() 184897acfc78SBram Moolenaar let caught = false 18499645e2d9SBram Moolenaar let x = 0 185097acfc78SBram Moolenaar try 18519645e2d9SBram Moolenaar while 1 18529645e2d9SBram Moolenaar x += 1 18539645e2d9SBram Moolenaar if x == 100 18549645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 18559645e2d9SBram Moolenaar endif 18569645e2d9SBram Moolenaar endwhile 185797acfc78SBram Moolenaar catch 185897acfc78SBram Moolenaar caught = true 185997acfc78SBram Moolenaar assert_equal(100, x) 186097acfc78SBram Moolenaar endtry 186197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 186225859dd7SBram Moolenaar # consume the CTRL-C 186325859dd7SBram Moolenaar getchar(0) 18649645e2d9SBram Moolenaarenddef 186520431c9dSBram Moolenaar 18664fdae999SBram Moolenaardef Test_automatic_line_continuation() 18674fdae999SBram Moolenaar let mylist = [ 18684fdae999SBram Moolenaar 'one', 18694fdae999SBram Moolenaar 'two', 18704fdae999SBram Moolenaar 'three', 1871f5be8cdbSBram Moolenaar ] # comment 18724fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 18734fdae999SBram Moolenaar 18744fdae999SBram Moolenaar let mydict = { 18754fdae999SBram Moolenaar 'one': 1, 18764fdae999SBram Moolenaar 'two': 2, 18774fdae999SBram Moolenaar 'three': 18784fdae999SBram Moolenaar 3, 1879f5be8cdbSBram Moolenaar } # comment 18804fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 18814fdae999SBram Moolenaar mydict = #{ 18822c330432SBram Moolenaar one: 1, # comment 18832c330432SBram Moolenaar two: # comment 18842c330432SBram Moolenaar 2, # comment 18852c330432SBram Moolenaar three: 3 # comment 18862c330432SBram Moolenaar } 18872c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 18882c330432SBram Moolenaar mydict = #{ 18892c330432SBram Moolenaar one: 1, 18904fdae999SBram Moolenaar two: 18914fdae999SBram Moolenaar 2, 18922c330432SBram Moolenaar three: 3 18934fdae999SBram Moolenaar } 18944fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1895e6085c53SBram Moolenaar 1896e6085c53SBram Moolenaar assert_equal( 1897e6085c53SBram Moolenaar ['one', 'two', 'three'], 1898e6085c53SBram Moolenaar split('one two three') 1899e6085c53SBram Moolenaar ) 19004fdae999SBram Moolenaarenddef 19014fdae999SBram Moolenaar 19027a092245SBram Moolenaardef Test_vim9_comment() 19037a092245SBram Moolenaar CheckScriptSuccess([ 19047a092245SBram Moolenaar 'vim9script', 19057a092245SBram Moolenaar '# something', 19067a092245SBram Moolenaar ]) 19077a092245SBram Moolenaar CheckScriptFailure([ 19087a092245SBram Moolenaar 'vim9script', 19097a092245SBram Moolenaar ':# something', 19107a092245SBram Moolenaar ], 'E488:') 19117a092245SBram Moolenaar CheckScriptFailure([ 19127a092245SBram Moolenaar '# something', 19137a092245SBram Moolenaar ], 'E488:') 19147a092245SBram Moolenaar CheckScriptFailure([ 19157a092245SBram Moolenaar ':# something', 19167a092245SBram Moolenaar ], 'E488:') 19177a092245SBram Moolenaar 19184a8d9f2eSBram Moolenaar { # block start 19194a8d9f2eSBram Moolenaar } # block end 19204a8d9f2eSBram Moolenaar CheckDefFailure([ 19214a8d9f2eSBram Moolenaar '{# comment', 19224a8d9f2eSBram Moolenaar ], 'E488:') 19234a8d9f2eSBram Moolenaar CheckDefFailure([ 19244a8d9f2eSBram Moolenaar '{', 19254a8d9f2eSBram Moolenaar '}# comment', 19264a8d9f2eSBram Moolenaar ], 'E488:') 19274a8d9f2eSBram Moolenaar 19284a8d9f2eSBram Moolenaar echo "yes" # comment 19294a8d9f2eSBram Moolenaar CheckDefFailure([ 19304a8d9f2eSBram Moolenaar 'echo "yes"# comment', 19314a8d9f2eSBram Moolenaar ], 'E488:') 19327a092245SBram Moolenaar CheckScriptSuccess([ 19337a092245SBram Moolenaar 'vim9script', 19347a092245SBram Moolenaar 'echo "yes" # something', 19357a092245SBram Moolenaar ]) 19367a092245SBram Moolenaar CheckScriptFailure([ 19377a092245SBram Moolenaar 'vim9script', 19387a092245SBram Moolenaar 'echo "yes"# something', 19397a092245SBram Moolenaar ], 'E121:') 19407a092245SBram Moolenaar CheckScriptFailure([ 19417a092245SBram Moolenaar 'vim9script', 19427a092245SBram Moolenaar 'echo# something', 19437a092245SBram Moolenaar ], 'E121:') 19447a092245SBram Moolenaar CheckScriptFailure([ 19457a092245SBram Moolenaar 'echo "yes" # something', 19467a092245SBram Moolenaar ], 'E121:') 19477a092245SBram Moolenaar 19484a8d9f2eSBram Moolenaar exe "echo" # comment 19494a8d9f2eSBram Moolenaar CheckDefFailure([ 19504a8d9f2eSBram Moolenaar 'exe "echo"# comment', 19514a8d9f2eSBram Moolenaar ], 'E488:') 19524a8d9f2eSBram Moolenaar CheckScriptSuccess([ 19534a8d9f2eSBram Moolenaar 'vim9script', 19544a8d9f2eSBram Moolenaar 'exe "echo" # something', 19554a8d9f2eSBram Moolenaar ]) 19564a8d9f2eSBram Moolenaar CheckScriptFailure([ 19574a8d9f2eSBram Moolenaar 'vim9script', 19584a8d9f2eSBram Moolenaar 'exe "echo"# something', 19594a8d9f2eSBram Moolenaar ], 'E121:') 19604a8d9f2eSBram Moolenaar CheckDefFailure([ 19614a8d9f2eSBram Moolenaar 'exe # comment', 19624a8d9f2eSBram Moolenaar ], 'E1015:') 19634a8d9f2eSBram Moolenaar CheckScriptFailure([ 19644a8d9f2eSBram Moolenaar 'vim9script', 19654a8d9f2eSBram Moolenaar 'exe# something', 19664a8d9f2eSBram Moolenaar ], 'E121:') 19674a8d9f2eSBram Moolenaar CheckScriptFailure([ 19684a8d9f2eSBram Moolenaar 'exe "echo" # something', 19694a8d9f2eSBram Moolenaar ], 'E121:') 19704a8d9f2eSBram Moolenaar 19717a092245SBram Moolenaar CheckDefFailure([ 19727a092245SBram Moolenaar 'try# comment', 19737a092245SBram Moolenaar ' echo "yes"', 19747a092245SBram Moolenaar 'catch', 19757a092245SBram Moolenaar 'endtry', 19767a092245SBram Moolenaar ], 'E488:') 19772c5ed4e3SBram Moolenaar CheckScriptFailure([ 19782c5ed4e3SBram Moolenaar 'vim9script', 19792c5ed4e3SBram Moolenaar 'try# comment', 19802c5ed4e3SBram Moolenaar 'echo "yes"', 19812c5ed4e3SBram Moolenaar ], 'E488:') 19827a092245SBram Moolenaar CheckDefFailure([ 19837a092245SBram Moolenaar 'try', 1984a72cfb80SBram Moolenaar ' throw#comment', 1985a72cfb80SBram Moolenaar 'catch', 1986a72cfb80SBram Moolenaar 'endtry', 1987a72cfb80SBram Moolenaar ], 'E1015:') 1988a72cfb80SBram Moolenaar CheckDefFailure([ 1989a72cfb80SBram Moolenaar 'try', 1990a72cfb80SBram Moolenaar ' throw "yes"#comment', 1991a72cfb80SBram Moolenaar 'catch', 1992a72cfb80SBram Moolenaar 'endtry', 1993a72cfb80SBram Moolenaar ], 'E488:') 1994a72cfb80SBram Moolenaar CheckDefFailure([ 1995a72cfb80SBram Moolenaar 'try', 19967a092245SBram Moolenaar ' echo "yes"', 19977a092245SBram Moolenaar 'catch# comment', 19987a092245SBram Moolenaar 'endtry', 19997a092245SBram Moolenaar ], 'E488:') 20002c5ed4e3SBram Moolenaar CheckScriptFailure([ 20012c5ed4e3SBram Moolenaar 'vim9script', 20022c5ed4e3SBram Moolenaar 'try', 20032c5ed4e3SBram Moolenaar ' echo "yes"', 20042c5ed4e3SBram Moolenaar 'catch# comment', 20052c5ed4e3SBram Moolenaar 'endtry', 20062c5ed4e3SBram Moolenaar ], 'E654:') 20072c5ed4e3SBram Moolenaar CheckDefFailure([ 20082c5ed4e3SBram Moolenaar 'try', 20092c5ed4e3SBram Moolenaar ' echo "yes"', 20102c5ed4e3SBram Moolenaar 'catch /pat/# comment', 20112c5ed4e3SBram Moolenaar 'endtry', 20122c5ed4e3SBram Moolenaar ], 'E488:') 20137a092245SBram Moolenaar CheckDefFailure([ 20147a092245SBram Moolenaar 'try', 20157a092245SBram Moolenaar 'echo "yes"', 20167a092245SBram Moolenaar 'catch', 20177a092245SBram Moolenaar 'endtry# comment', 20187a092245SBram Moolenaar ], 'E488:') 20192c5ed4e3SBram Moolenaar CheckScriptFailure([ 20202c5ed4e3SBram Moolenaar 'vim9script', 20212c5ed4e3SBram Moolenaar 'try', 20222c5ed4e3SBram Moolenaar ' echo "yes"', 20232c5ed4e3SBram Moolenaar 'catch', 20242c5ed4e3SBram Moolenaar 'endtry# comment', 20259b7bf9e9SBram Moolenaar ], 'E488:') 20262c5ed4e3SBram Moolenaar 20272c5ed4e3SBram Moolenaar CheckScriptSuccess([ 20282c5ed4e3SBram Moolenaar 'vim9script', 20292c5ed4e3SBram Moolenaar 'hi # comment', 20302c5ed4e3SBram Moolenaar ]) 20312c5ed4e3SBram Moolenaar CheckScriptFailure([ 20322c5ed4e3SBram Moolenaar 'vim9script', 20332c5ed4e3SBram Moolenaar 'hi# comment', 20342c5ed4e3SBram Moolenaar ], 'E416:') 20351966c248SBram Moolenaar CheckScriptSuccess([ 20361966c248SBram Moolenaar 'vim9script', 20371966c248SBram Moolenaar 'hi Search # comment', 20381966c248SBram Moolenaar ]) 20391966c248SBram Moolenaar CheckScriptFailure([ 20401966c248SBram Moolenaar 'vim9script', 20411966c248SBram Moolenaar 'hi Search# comment', 20421966c248SBram Moolenaar ], 'E416:') 20431966c248SBram Moolenaar CheckScriptSuccess([ 20441966c248SBram Moolenaar 'vim9script', 20451966c248SBram Moolenaar 'hi link This Search # comment', 20461966c248SBram Moolenaar ]) 20471966c248SBram Moolenaar CheckScriptFailure([ 20481966c248SBram Moolenaar 'vim9script', 20491966c248SBram Moolenaar 'hi link This That# comment', 20501966c248SBram Moolenaar ], 'E413:') 20511966c248SBram Moolenaar CheckScriptSuccess([ 20521966c248SBram Moolenaar 'vim9script', 20531966c248SBram Moolenaar 'hi clear This # comment', 20541966c248SBram Moolenaar 'hi clear # comment', 20551966c248SBram Moolenaar ]) 2056f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2057f5be8cdbSBram Moolenaar # hi clear This# comment', 20581966c248SBram Moolenaar CheckScriptFailure([ 20591966c248SBram Moolenaar 'vim9script', 20601966c248SBram Moolenaar 'hi clear# comment', 20611966c248SBram Moolenaar ], 'E416:') 20621966c248SBram Moolenaar 20631966c248SBram Moolenaar CheckScriptSuccess([ 20641966c248SBram Moolenaar 'vim9script', 20651966c248SBram Moolenaar 'hi Group term=bold', 20661966c248SBram Moolenaar 'match Group /todo/ # comment', 20671966c248SBram Moolenaar ]) 20681966c248SBram Moolenaar CheckScriptFailure([ 20691966c248SBram Moolenaar 'vim9script', 20701966c248SBram Moolenaar 'hi Group term=bold', 20711966c248SBram Moolenaar 'match Group /todo/# comment', 20721966c248SBram Moolenaar ], 'E488:') 20731966c248SBram Moolenaar CheckScriptSuccess([ 20741966c248SBram Moolenaar 'vim9script', 20751966c248SBram Moolenaar 'match # comment', 20761966c248SBram Moolenaar ]) 20771966c248SBram Moolenaar CheckScriptFailure([ 20781966c248SBram Moolenaar 'vim9script', 20791966c248SBram Moolenaar 'match# comment', 20801966c248SBram Moolenaar ], 'E475:') 20811966c248SBram Moolenaar CheckScriptSuccess([ 20821966c248SBram Moolenaar 'vim9script', 20831966c248SBram Moolenaar 'match none # comment', 20841966c248SBram Moolenaar ]) 20851966c248SBram Moolenaar CheckScriptFailure([ 20861966c248SBram Moolenaar 'vim9script', 20871966c248SBram Moolenaar 'match none# comment', 20881966c248SBram Moolenaar ], 'E475:') 20891966c248SBram Moolenaar 20901966c248SBram Moolenaar CheckScriptSuccess([ 20911966c248SBram Moolenaar 'vim9script', 20921966c248SBram Moolenaar 'menutrans clear # comment', 20931966c248SBram Moolenaar ]) 20941966c248SBram Moolenaar CheckScriptFailure([ 20951966c248SBram Moolenaar 'vim9script', 20961966c248SBram Moolenaar 'menutrans clear# comment text', 20971966c248SBram Moolenaar ], 'E474:') 20981966c248SBram Moolenaar 20991966c248SBram Moolenaar CheckScriptSuccess([ 21001966c248SBram Moolenaar 'vim9script', 21011966c248SBram Moolenaar 'syntax clear # comment', 21021966c248SBram Moolenaar ]) 21031966c248SBram Moolenaar CheckScriptFailure([ 21041966c248SBram Moolenaar 'vim9script', 21051966c248SBram Moolenaar 'syntax clear# comment text', 21061966c248SBram Moolenaar ], 'E28:') 21071966c248SBram Moolenaar CheckScriptSuccess([ 21081966c248SBram Moolenaar 'vim9script', 21091966c248SBram Moolenaar 'syntax keyword Word some', 21101966c248SBram Moolenaar 'syntax clear Word # comment', 21111966c248SBram Moolenaar ]) 21121966c248SBram Moolenaar CheckScriptFailure([ 21131966c248SBram Moolenaar 'vim9script', 21141966c248SBram Moolenaar 'syntax keyword Word some', 21151966c248SBram Moolenaar 'syntax clear Word# comment text', 21161966c248SBram Moolenaar ], 'E28:') 21171966c248SBram Moolenaar 21181966c248SBram Moolenaar CheckScriptSuccess([ 21191966c248SBram Moolenaar 'vim9script', 21201966c248SBram Moolenaar 'syntax list # comment', 21211966c248SBram Moolenaar ]) 21221966c248SBram Moolenaar CheckScriptFailure([ 21231966c248SBram Moolenaar 'vim9script', 21241966c248SBram Moolenaar 'syntax list# comment text', 21251966c248SBram Moolenaar ], 'E28:') 21261966c248SBram Moolenaar 21271966c248SBram Moolenaar CheckScriptSuccess([ 21281966c248SBram Moolenaar 'vim9script', 21291966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 21301966c248SBram Moolenaar ]) 21311966c248SBram Moolenaar CheckScriptFailure([ 21321966c248SBram Moolenaar 'vim9script', 21331966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 21341966c248SBram Moolenaar ], 'E475:') 21351966c248SBram Moolenaar 21361966c248SBram Moolenaar CheckScriptSuccess([ 21371966c248SBram Moolenaar 'vim9script', 21381966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 21391966c248SBram Moolenaar ]) 21401966c248SBram Moolenaar CheckScriptFailure([ 21411966c248SBram Moolenaar 'vim9script', 21421966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 21431966c248SBram Moolenaar ], 'E789:') 21441966c248SBram Moolenaar 21451966c248SBram Moolenaar CheckScriptSuccess([ 21461966c248SBram Moolenaar 'vim9script', 21471966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 21481966c248SBram Moolenaar ]) 21491966c248SBram Moolenaar CheckScriptFailure([ 21501966c248SBram Moolenaar 'vim9script', 21511966c248SBram Moolenaar 'syntax match Word /pat/# comment', 21521966c248SBram Moolenaar ], 'E402:') 21531966c248SBram Moolenaar 21541966c248SBram Moolenaar CheckScriptSuccess([ 21551966c248SBram Moolenaar 'vim9script', 21561966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 21571966c248SBram Moolenaar ]) 21581966c248SBram Moolenaar CheckScriptFailure([ 21591966c248SBram Moolenaar 'vim9script', 21601966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 21611966c248SBram Moolenaar ], 'E475:') 21621966c248SBram Moolenaar CheckScriptFailure([ 21631966c248SBram Moolenaar 'vim9script', 21641966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 21651966c248SBram Moolenaar ], 'E406:') 21661966c248SBram Moolenaar CheckScriptFailure([ 21671966c248SBram Moolenaar 'vim9script', 21681966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 21691966c248SBram Moolenaar ], 'E475:') 21701966c248SBram Moolenaar 21711966c248SBram Moolenaar CheckScriptSuccess([ 21721966c248SBram Moolenaar 'vim9script', 21731966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 21741966c248SBram Moolenaar ]) 21751966c248SBram Moolenaar CheckScriptFailure([ 21761966c248SBram Moolenaar 'vim9script', 21771966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2178d032f34aSBram Moolenaar ], 'E402:') 21791966c248SBram Moolenaar 21801966c248SBram Moolenaar CheckScriptSuccess([ 21811966c248SBram Moolenaar 'vim9script', 21821966c248SBram Moolenaar 'syntax sync # comment', 21831966c248SBram Moolenaar ]) 21841966c248SBram Moolenaar CheckScriptFailure([ 21851966c248SBram Moolenaar 'vim9script', 21861966c248SBram Moolenaar 'syntax sync# comment', 21871966c248SBram Moolenaar ], 'E404:') 21881966c248SBram Moolenaar CheckScriptSuccess([ 21891966c248SBram Moolenaar 'vim9script', 21901966c248SBram Moolenaar 'syntax sync ccomment # comment', 21911966c248SBram Moolenaar ]) 21921966c248SBram Moolenaar CheckScriptFailure([ 21931966c248SBram Moolenaar 'vim9script', 21941966c248SBram Moolenaar 'syntax sync ccomment# comment', 21951966c248SBram Moolenaar ], 'E404:') 21961966c248SBram Moolenaar 21971966c248SBram Moolenaar CheckScriptSuccess([ 21981966c248SBram Moolenaar 'vim9script', 21991966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 22001966c248SBram Moolenaar ]) 22011966c248SBram Moolenaar CheckScriptFailure([ 22021966c248SBram Moolenaar 'vim9script', 22031966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 22041966c248SBram Moolenaar ], 'E475:') 2205a72cfb80SBram Moolenaar 2206a72cfb80SBram Moolenaar CheckScriptSuccess([ 2207a72cfb80SBram Moolenaar 'vim9script', 2208a72cfb80SBram Moolenaar 'command Echo echo # comment', 2209a72cfb80SBram Moolenaar 'command Echo # comment', 2210a72cfb80SBram Moolenaar ]) 2211a72cfb80SBram Moolenaar CheckScriptFailure([ 2212a72cfb80SBram Moolenaar 'vim9script', 2213a72cfb80SBram Moolenaar 'command Echo echo# comment', 2214a72cfb80SBram Moolenaar 'Echo', 2215a72cfb80SBram Moolenaar ], 'E121:') 2216a72cfb80SBram Moolenaar CheckScriptFailure([ 2217a72cfb80SBram Moolenaar 'vim9script', 2218a72cfb80SBram Moolenaar 'command Echo# comment', 2219a72cfb80SBram Moolenaar ], 'E182:') 2220a72cfb80SBram Moolenaar CheckScriptFailure([ 2221a72cfb80SBram Moolenaar 'vim9script', 2222a72cfb80SBram Moolenaar 'command Echo echo', 2223a72cfb80SBram Moolenaar 'command Echo# comment', 2224a72cfb80SBram Moolenaar ], 'E182:') 2225a72cfb80SBram Moolenaar 2226a72cfb80SBram Moolenaar CheckScriptSuccess([ 2227a72cfb80SBram Moolenaar 'vim9script', 2228a72cfb80SBram Moolenaar 'function # comment', 2229a72cfb80SBram Moolenaar ]) 2230a72cfb80SBram Moolenaar CheckScriptFailure([ 2231a72cfb80SBram Moolenaar 'vim9script', 22329898107fSBram Moolenaar 'function " comment', 22339898107fSBram Moolenaar ], 'E129:') 22349898107fSBram Moolenaar CheckScriptFailure([ 22359898107fSBram Moolenaar 'vim9script', 2236a72cfb80SBram Moolenaar 'function# comment', 2237a72cfb80SBram Moolenaar ], 'E129:') 2238a72cfb80SBram Moolenaar CheckScriptSuccess([ 2239a72cfb80SBram Moolenaar 'vim9script', 2240a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2241a72cfb80SBram Moolenaar ]) 2242a72cfb80SBram Moolenaar CheckScriptFailure([ 2243a72cfb80SBram Moolenaar 'vim9script', 2244a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2245a72cfb80SBram Moolenaar ], 'E488:') 2246a72cfb80SBram Moolenaar 2247a72cfb80SBram Moolenaar CheckScriptSuccess([ 2248a72cfb80SBram Moolenaar 'vim9script', 22494c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2250a72cfb80SBram Moolenaar 'endfunc', 22514c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2252a72cfb80SBram Moolenaar ]) 2253a72cfb80SBram Moolenaar CheckScriptFailure([ 2254a72cfb80SBram Moolenaar 'vim9script', 22554c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2256a72cfb80SBram Moolenaar 'endfunc', 22574c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2258a72cfb80SBram Moolenaar ], 'E488:') 2259a72cfb80SBram Moolenaar 2260a72cfb80SBram Moolenaar CheckScriptSuccess([ 2261a72cfb80SBram Moolenaar 'vim9script', 2262a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2263a72cfb80SBram Moolenaar ]) 2264a72cfb80SBram Moolenaar CheckScriptFailure([ 2265a72cfb80SBram Moolenaar 'vim9script', 2266a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2267a72cfb80SBram Moolenaar ], 'E488:') 2268e7e4838fSBram Moolenaar 2269e7e4838fSBram Moolenaar CheckScriptFailure([ 2270e7e4838fSBram Moolenaar 'def Test() " comment', 2271e7e4838fSBram Moolenaar 'enddef', 2272e7e4838fSBram Moolenaar ], 'E488:') 2273e7e4838fSBram Moolenaar CheckScriptFailure([ 2274e7e4838fSBram Moolenaar 'vim9script', 2275e7e4838fSBram Moolenaar 'def Test() " comment', 2276e7e4838fSBram Moolenaar 'enddef', 2277e7e4838fSBram Moolenaar ], 'E488:') 2278e7e4838fSBram Moolenaar 2279e7e4838fSBram Moolenaar CheckScriptSuccess([ 2280e7e4838fSBram Moolenaar 'func Test() " comment', 2281e7e4838fSBram Moolenaar 'endfunc', 2282e7e4838fSBram Moolenaar ]) 22839898107fSBram Moolenaar CheckScriptSuccess([ 2284e7e4838fSBram Moolenaar 'vim9script', 2285e7e4838fSBram Moolenaar 'func Test() " comment', 2286e7e4838fSBram Moolenaar 'endfunc', 22879898107fSBram Moolenaar ]) 2288e7e4838fSBram Moolenaar 2289e7e4838fSBram Moolenaar CheckScriptSuccess([ 2290e7e4838fSBram Moolenaar 'def Test() # comment', 2291e7e4838fSBram Moolenaar 'enddef', 2292e7e4838fSBram Moolenaar ]) 2293e7e4838fSBram Moolenaar CheckScriptFailure([ 2294e7e4838fSBram Moolenaar 'func Test() # comment', 2295e7e4838fSBram Moolenaar 'endfunc', 2296e7e4838fSBram Moolenaar ], 'E488:') 22972c5ed4e3SBram Moolenaarenddef 22982c5ed4e3SBram Moolenaar 22992c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 23002c5ed4e3SBram Moolenaar CheckCanRunGui 23012c5ed4e3SBram Moolenaar 23022c5ed4e3SBram Moolenaar CheckScriptFailure([ 23032c5ed4e3SBram Moolenaar 'vim9script', 23042c5ed4e3SBram Moolenaar 'gui#comment' 23052c5ed4e3SBram Moolenaar ], 'E499:') 23062c5ed4e3SBram Moolenaar CheckScriptFailure([ 23072c5ed4e3SBram Moolenaar 'vim9script', 23082c5ed4e3SBram Moolenaar 'gui -f#comment' 23092c5ed4e3SBram Moolenaar ], 'E499:') 23107a092245SBram Moolenaarenddef 23117a092245SBram Moolenaar 2312a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 23136797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 23146797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2315a26b9700SBram Moolenaar 2316a26b9700SBram Moolenaar edit test.vim 2317a26b9700SBram Moolenaar doautocmd TabEnter #comment 2318a26b9700SBram Moolenaar assert_equal(1, g:entered) 2319a26b9700SBram Moolenaar 2320a26b9700SBram Moolenaar doautocmd TabEnter f.x 2321a26b9700SBram Moolenaar assert_equal(2, g:entered) 2322a26b9700SBram Moolenaar 2323a26b9700SBram Moolenaar g:entered = 0 2324a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2325a26b9700SBram Moolenaar assert_equal(2, g:entered) 2326a26b9700SBram Moolenaar 2327a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2328a26b9700SBram Moolenaar 2329a26b9700SBram Moolenaar au! TabEnter 2330a26b9700SBram Moolenaar unlet g:entered 2331d72c1bf0SBram Moolenaar 2332d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2333d72c1bf0SBram Moolenaar 'vim9script', 23346797966dSBram Moolenaar 'g:var = 123', 2335e55b1c09SBram Moolenaar 'b:var = 456', 2336e55b1c09SBram Moolenaar 'w:var = 777', 2337e55b1c09SBram Moolenaar 't:var = 888', 2338d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2339d72c1bf0SBram Moolenaar ]) 2340d72c1bf0SBram Moolenaar 2341d72c1bf0SBram Moolenaar CheckScriptFailure([ 2342d72c1bf0SBram Moolenaar 'vim9script', 2343d72c1bf0SBram Moolenaar 'let g:var = 123', 2344e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2345e55b1c09SBram Moolenaar 2346e55b1c09SBram Moolenaar CheckScriptFailure([ 2347e55b1c09SBram Moolenaar 'vim9script', 2348e55b1c09SBram Moolenaar 'let b:var = 123', 2349e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2350e55b1c09SBram Moolenaar 2351e55b1c09SBram Moolenaar CheckScriptFailure([ 2352e55b1c09SBram Moolenaar 'vim9script', 2353e55b1c09SBram Moolenaar 'let w:var = 123', 2354e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2355e55b1c09SBram Moolenaar 2356e55b1c09SBram Moolenaar CheckScriptFailure([ 2357e55b1c09SBram Moolenaar 'vim9script', 2358e55b1c09SBram Moolenaar 'let t:var = 123', 2359e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2360e55b1c09SBram Moolenaar 2361e55b1c09SBram Moolenaar CheckScriptFailure([ 2362e55b1c09SBram Moolenaar 'vim9script', 2363e55b1c09SBram Moolenaar 'let v:version = 123', 2364e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2365e55b1c09SBram Moolenaar 2366e55b1c09SBram Moolenaar CheckScriptFailure([ 2367e55b1c09SBram Moolenaar 'vim9script', 2368e55b1c09SBram Moolenaar 'let $VARIABLE = "text"', 2369e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 23706797966dSBram Moolenaar 23716797966dSBram Moolenaar CheckScriptFailure([ 23726797966dSBram Moolenaar 'vim9script', 23736797966dSBram Moolenaar 'g:var = 123', 237432e35117SBram Moolenaar 'unlet g:var# comment1', 2375d72c1bf0SBram Moolenaar ], 'E108:') 2376d72c1bf0SBram Moolenaar 2377d72c1bf0SBram Moolenaar CheckScriptFailure([ 2378d72c1bf0SBram Moolenaar 'let g:var = 123', 2379d72c1bf0SBram Moolenaar 'unlet g:var # something', 2380d72c1bf0SBram Moolenaar ], 'E488:') 2381faac4104SBram Moolenaar 2382faac4104SBram Moolenaar CheckScriptSuccess([ 2383faac4104SBram Moolenaar 'vim9script', 238432e35117SBram Moolenaar 'if 1 # comment2', 2385faac4104SBram Moolenaar ' echo "yes"', 2386faac4104SBram Moolenaar 'elseif 2 #comment', 2387faac4104SBram Moolenaar ' echo "no"', 2388faac4104SBram Moolenaar 'endif', 2389faac4104SBram Moolenaar ]) 2390faac4104SBram Moolenaar 2391faac4104SBram Moolenaar CheckScriptFailure([ 2392faac4104SBram Moolenaar 'vim9script', 239332e35117SBram Moolenaar 'if 1# comment3', 2394faac4104SBram Moolenaar ' echo "yes"', 2395faac4104SBram Moolenaar 'endif', 2396faac4104SBram Moolenaar ], 'E15:') 2397faac4104SBram Moolenaar 2398faac4104SBram Moolenaar CheckScriptFailure([ 2399faac4104SBram Moolenaar 'vim9script', 240032e35117SBram Moolenaar 'if 0 # comment4', 2401faac4104SBram Moolenaar ' echo "yes"', 2402faac4104SBram Moolenaar 'elseif 2#comment', 2403faac4104SBram Moolenaar ' echo "no"', 2404faac4104SBram Moolenaar 'endif', 2405faac4104SBram Moolenaar ], 'E15:') 2406faac4104SBram Moolenaar 2407faac4104SBram Moolenaar CheckScriptSuccess([ 2408faac4104SBram Moolenaar 'vim9script', 240932e35117SBram Moolenaar 'let v = 1 # comment5', 2410faac4104SBram Moolenaar ]) 2411faac4104SBram Moolenaar 2412faac4104SBram Moolenaar CheckScriptFailure([ 2413faac4104SBram Moolenaar 'vim9script', 241432e35117SBram Moolenaar 'let v = 1# comment6', 241532e35117SBram Moolenaar ], 'E15:') 2416faac4104SBram Moolenaar 2417faac4104SBram Moolenaar CheckScriptSuccess([ 2418faac4104SBram Moolenaar 'vim9script', 2419faac4104SBram Moolenaar 'new' 2420d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2421df069eecSBram Moolenaar ':$', 2422faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2423faac4104SBram Moolenaar 'bwipe!', 2424faac4104SBram Moolenaar ]) 2425faac4104SBram Moolenaar 2426f5be8cdbSBram Moolenaar CheckScriptFailure([ 2427f5be8cdbSBram Moolenaar 'vim9script', 2428f5be8cdbSBram Moolenaar 'new' 2429d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2430f5be8cdbSBram Moolenaar ':$', 2431f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2432f5be8cdbSBram Moolenaar 'bwipe!', 2433f5be8cdbSBram Moolenaar ], 'E488:') 2434f5be8cdbSBram Moolenaar 2435f5be8cdbSBram Moolenaar CheckScriptFailure([ 2436f5be8cdbSBram Moolenaar 'vim9script', 2437f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2438f5be8cdbSBram Moolenaar ], 'E477:') 2439a26b9700SBram Moolenaarenddef 2440a26b9700SBram Moolenaar 24417e5bd91dSBram Moolenaardef Test_finish() 24427e5bd91dSBram Moolenaar let lines =<< trim END 24437e5bd91dSBram Moolenaar vim9script 24446797966dSBram Moolenaar g:res = 'one' 24457e5bd91dSBram Moolenaar if v:false | finish | endif 24466797966dSBram Moolenaar g:res = 'two' 24477e5bd91dSBram Moolenaar finish 24486797966dSBram Moolenaar g:res = 'three' 24497e5bd91dSBram Moolenaar END 24507e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 24517e5bd91dSBram Moolenaar source Xfinished 24527e5bd91dSBram Moolenaar assert_equal('two', g:res) 24537e5bd91dSBram Moolenaar 24547e5bd91dSBram Moolenaar unlet g:res 24557e5bd91dSBram Moolenaar delete('Xfinished') 24567e5bd91dSBram Moolenaarenddef 24577e5bd91dSBram Moolenaar 245832e35117SBram Moolenaardef Test_let_func_call() 245932e35117SBram Moolenaar let lines =<< trim END 246032e35117SBram Moolenaar vim9script 246132e35117SBram Moolenaar func GetValue() 246232e35117SBram Moolenaar if exists('g:count') 246332e35117SBram Moolenaar let g:count += 1 246432e35117SBram Moolenaar else 246532e35117SBram Moolenaar let g:count = 1 246632e35117SBram Moolenaar endif 246732e35117SBram Moolenaar return 'this' 246832e35117SBram Moolenaar endfunc 246932e35117SBram Moolenaar let val: string = GetValue() 2470f5be8cdbSBram Moolenaar # env var is always a string 2471df671b46SBram Moolenaar let env = $TERM 247232e35117SBram Moolenaar END 247332e35117SBram Moolenaar writefile(lines, 'Xfinished') 247432e35117SBram Moolenaar source Xfinished 2475f5be8cdbSBram Moolenaar # GetValue() is not called during discovery phase 247632e35117SBram Moolenaar assert_equal(1, g:count) 247732e35117SBram Moolenaar 247832e35117SBram Moolenaar unlet g:count 247932e35117SBram Moolenaar delete('Xfinished') 248032e35117SBram Moolenaarenddef 248132e35117SBram Moolenaar 248232e35117SBram Moolenaardef Test_let_missing_type() 248332e35117SBram Moolenaar let lines =<< trim END 248432e35117SBram Moolenaar vim9script 2485df671b46SBram Moolenaar let var = g:unknown 2486227a69deSBram Moolenaar END 2487822ba247SBram Moolenaar CheckScriptFailure(lines, 'E121:') 2488227a69deSBram Moolenaar 2489227a69deSBram Moolenaar lines =<< trim END 2490227a69deSBram Moolenaar vim9script 2491227a69deSBram Moolenaar let nr: number = 123 2492227a69deSBram Moolenaar let var = nr 2493227a69deSBram Moolenaar END 2494822ba247SBram Moolenaar CheckScriptSuccess(lines) 249532e35117SBram Moolenaarenddef 249632e35117SBram Moolenaar 2497c82a5b5dSBram Moolenaardef Test_let_declaration() 2498c82a5b5dSBram Moolenaar let lines =<< trim END 2499c82a5b5dSBram Moolenaar vim9script 2500c82a5b5dSBram Moolenaar let var: string 2501c82a5b5dSBram Moolenaar g:var_uninit = var 2502c82a5b5dSBram Moolenaar var = 'text' 2503c82a5b5dSBram Moolenaar g:var_test = var 2504f5be8cdbSBram Moolenaar # prefixing s: is optional 2505984dddbeSBram Moolenaar s:var = 'prefixed' 2506984dddbeSBram Moolenaar g:var_prefixed = s:var 2507984dddbeSBram Moolenaar 2508984dddbeSBram Moolenaar let s:other: number 2509984dddbeSBram Moolenaar other = 1234 2510984dddbeSBram Moolenaar g:other_var = other 251153b29e48SBram Moolenaar 251253b29e48SBram Moolenaar # type is inferred 251353b29e48SBram Moolenaar s:dict = {'a': 222} 251453b29e48SBram Moolenaar def GetDictVal(key: any) 251553b29e48SBram Moolenaar g:dict_val = s:dict[key] 251653b29e48SBram Moolenaar enddef 251753b29e48SBram Moolenaar GetDictVal('a') 2518c82a5b5dSBram Moolenaar END 2519c82a5b5dSBram Moolenaar CheckScriptSuccess(lines) 2520c82a5b5dSBram Moolenaar assert_equal('', g:var_uninit) 2521c82a5b5dSBram Moolenaar assert_equal('text', g:var_test) 2522984dddbeSBram Moolenaar assert_equal('prefixed', g:var_prefixed) 2523984dddbeSBram Moolenaar assert_equal(1234, g:other_var) 252453b29e48SBram Moolenaar assert_equal(222, g:dict_val) 2525c82a5b5dSBram Moolenaar 2526c82a5b5dSBram Moolenaar unlet g:var_uninit 2527c82a5b5dSBram Moolenaar unlet g:var_test 2528984dddbeSBram Moolenaar unlet g:var_prefixed 2529984dddbeSBram Moolenaar unlet g:other_var 2530c82a5b5dSBram Moolenaarenddef 2531c82a5b5dSBram Moolenaar 2532c5b1c20bSBram Moolenaardef Test_let_declaration_fails() 2533c5b1c20bSBram Moolenaar let lines =<< trim END 2534c5b1c20bSBram Moolenaar vim9script 2535c5b1c20bSBram Moolenaar const var: string 2536c5b1c20bSBram Moolenaar END 2537c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1021:') 2538c5b1c20bSBram Moolenaar 2539c5b1c20bSBram Moolenaar lines =<< trim END 2540c5b1c20bSBram Moolenaar vim9script 2541c5b1c20bSBram Moolenaar let 9var: string 2542c5b1c20bSBram Moolenaar END 2543c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E475:') 2544c5b1c20bSBram Moolenaarenddef 2545c5b1c20bSBram Moolenaar 254634db91f7SBram Moolenaardef Test_let_type_check() 254734db91f7SBram Moolenaar let lines =<< trim END 254834db91f7SBram Moolenaar vim9script 254934db91f7SBram Moolenaar let var: string 255034db91f7SBram Moolenaar var = 1234 255134db91f7SBram Moolenaar END 2552451c2e35SBram Moolenaar CheckScriptFailure(lines, 'E1012:') 2553984dddbeSBram Moolenaar 2554984dddbeSBram Moolenaar lines =<< trim END 2555984dddbeSBram Moolenaar vim9script 2556984dddbeSBram Moolenaar let var:string 2557984dddbeSBram Moolenaar END 2558984dddbeSBram Moolenaar CheckScriptFailure(lines, 'E1069:') 2559c5b1c20bSBram Moolenaar 2560c5b1c20bSBram Moolenaar lines =<< trim END 2561c5b1c20bSBram Moolenaar vim9script 2562c5b1c20bSBram Moolenaar let var: asdf 2563c5b1c20bSBram Moolenaar END 2564c5b1c20bSBram Moolenaar CheckScriptFailure(lines, 'E1010:') 2565a71e2633SBram Moolenaar 2566a71e2633SBram Moolenaar lines =<< trim END 2567a71e2633SBram Moolenaar vim9script 2568a71e2633SBram Moolenaar let s:l: list<number> 2569a71e2633SBram Moolenaar s:l = [] 2570a71e2633SBram Moolenaar END 2571a71e2633SBram Moolenaar CheckScriptSuccess(lines) 2572a71e2633SBram Moolenaar 2573a71e2633SBram Moolenaar lines =<< trim END 2574a71e2633SBram Moolenaar vim9script 2575a71e2633SBram Moolenaar let s:d: dict<number> 2576a71e2633SBram Moolenaar s:d = {} 2577a71e2633SBram Moolenaar END 2578a71e2633SBram Moolenaar CheckScriptSuccess(lines) 257934db91f7SBram Moolenaarenddef 258034db91f7SBram Moolenaar 25815e654230SBram Moolenaarlet g:dict_number = #{one: 1, two: 2} 25825e654230SBram Moolenaar 25835e654230SBram Moolenaardef Test_let_list_dict_type() 25845e654230SBram Moolenaar let ll: list<number> 25855e654230SBram Moolenaar ll = [1, 2, 2, 3, 3, 3]->uniq() 25865e654230SBram Moolenaar ll->assert_equal([1, 2, 3]) 25875e654230SBram Moolenaar 25885e654230SBram Moolenaar let dd: dict<number> 25895e654230SBram Moolenaar dd = g:dict_number 25905e654230SBram Moolenaar dd->assert_equal(g:dict_number) 25915e654230SBram Moolenaar 25925e654230SBram Moolenaar let lines =<< trim END 25935e654230SBram Moolenaar let ll: list<number> 25945e654230SBram Moolenaar ll = [1, 2, 3]->map('"one"') 25955e654230SBram Moolenaar END 25965e654230SBram Moolenaar CheckDefExecFailure(lines, 'E1012: Type mismatch; expected list<number> but got list<string>') 25975e654230SBram Moolenaarenddef 25985e654230SBram Moolenaar 2599a5d0077eSBram Moolenaardef Test_forward_declaration() 2600a5d0077eSBram Moolenaar let lines =<< trim END 2601a5d0077eSBram Moolenaar vim9script 2602a5d0077eSBram Moolenaar def GetValue(): string 2603a5d0077eSBram Moolenaar return theVal 2604a5d0077eSBram Moolenaar enddef 2605a5d0077eSBram Moolenaar let theVal = 'something' 2606822ba247SBram Moolenaar g:initVal = GetValue() 2607a5d0077eSBram Moolenaar theVal = 'else' 2608a5d0077eSBram Moolenaar g:laterVal = GetValue() 2609a5d0077eSBram Moolenaar END 2610a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2611a5d0077eSBram Moolenaar source Xforward 2612a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2613a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2614a5d0077eSBram Moolenaar 2615a5d0077eSBram Moolenaar unlet g:initVal 2616a5d0077eSBram Moolenaar unlet g:laterVal 2617a5d0077eSBram Moolenaar delete('Xforward') 2618a5d0077eSBram Moolenaarenddef 2619a5d0077eSBram Moolenaar 26209721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 26219721fb4eSBram Moolenaar let legacy_lines =<< trim END 26229721fb4eSBram Moolenaar source Xvim9_script.vim 26239721fb4eSBram Moolenaar 26249721fb4eSBram Moolenaar call assert_false(exists('local')) 26259721fb4eSBram Moolenaar call assert_false(exists('exported')) 26269721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 26279721fb4eSBram Moolenaar call assert_equal('global', global) 26289721fb4eSBram Moolenaar call assert_equal('global', g:global) 26299721fb4eSBram Moolenaar 26309721fb4eSBram Moolenaar " imported variable becomes script-local 26319721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 26329721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 26339721fb4eSBram Moolenaar call assert_false(exists('exported')) 26349721fb4eSBram Moolenaar 26359721fb4eSBram Moolenaar " imported function becomes script-local 26369721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 26379721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 26389721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 26399721fb4eSBram Moolenaar END 26409721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 26419721fb4eSBram Moolenaar 26429721fb4eSBram Moolenaar let vim9_lines =<< trim END 26439721fb4eSBram Moolenaar vim9script 26449721fb4eSBram Moolenaar let local = 'local' 26459721fb4eSBram Moolenaar g:global = 'global' 26469721fb4eSBram Moolenaar export let exported = 'exported' 26479721fb4eSBram Moolenaar export def GetText(): string 26489721fb4eSBram Moolenaar return 'text' 26499721fb4eSBram Moolenaar enddef 26509721fb4eSBram Moolenaar END 26519721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 26529721fb4eSBram Moolenaar 26539721fb4eSBram Moolenaar source Xlegacy_script.vim 26549721fb4eSBram Moolenaar 26559721fb4eSBram Moolenaar assert_equal('global', g:global) 2656f5be8cdbSBram Moolenaar unlet g:global 26579721fb4eSBram Moolenaar 26589721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 26599721fb4eSBram Moolenaar delete('Xvim9_script.vim') 26609721fb4eSBram Moolenaarenddef 2661a5d0077eSBram Moolenaar 26627d699701SBram Moolenaarfunc Test_vim9script_not_global() 26637d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 26647d699701SBram Moolenaar let vim9lines =<< trim END 26657d699701SBram Moolenaar vim9script 26667d699701SBram Moolenaar let var = 'local' 26677d699701SBram Moolenaar func TheFunc() 26687d699701SBram Moolenaar echo 'local' 26697d699701SBram Moolenaar endfunc 26707d699701SBram Moolenaar def DefFunc() 26717d699701SBram Moolenaar echo 'local' 26727d699701SBram Moolenaar enddef 26737d699701SBram Moolenaar END 26747d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 26757d699701SBram Moolenaar source Xvim9script.vim 26767d699701SBram Moolenaar try 26777d699701SBram Moolenaar echo g:var 26787d699701SBram Moolenaar assert_report('did not fail') 26797d699701SBram Moolenaar catch /E121:/ 26807d699701SBram Moolenaar " caught 26817d699701SBram Moolenaar endtry 26827d699701SBram Moolenaar try 26837d699701SBram Moolenaar call TheFunc() 26847d699701SBram Moolenaar assert_report('did not fail') 26857d699701SBram Moolenaar catch /E117:/ 26867d699701SBram Moolenaar " caught 26877d699701SBram Moolenaar endtry 26887d699701SBram Moolenaar try 26897d699701SBram Moolenaar call DefFunc() 26907d699701SBram Moolenaar assert_report('did not fail') 26917d699701SBram Moolenaar catch /E117:/ 26927d699701SBram Moolenaar " caught 26937d699701SBram Moolenaar endtry 26947d699701SBram Moolenaar 269525859dd7SBram Moolenaar call delete('Xvim9script.vim') 26967d699701SBram Moolenaarendfunc 26977d699701SBram Moolenaar 2698eeb27bfeSBram Moolenaardef Test_vim9_copen() 2699eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2700eeb27bfeSBram Moolenaar copen 2701eeb27bfeSBram Moolenaar quit 2702eeb27bfeSBram Moolenaarenddef 2703eeb27bfeSBram Moolenaar 27042d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 27052d6b20d6SBram Moolenaardef Test_vim9_autoload() 27062d6b20d6SBram Moolenaar let lines =<< trim END 27072d6b20d6SBram Moolenaar vim9script 27082d6b20d6SBram Moolenaar def foo#test() 27092d6b20d6SBram Moolenaar echomsg getreg('"') 27102d6b20d6SBram Moolenaar enddef 27112d6b20d6SBram Moolenaar END 27122d6b20d6SBram Moolenaar 27132d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 27142d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 27152d6b20d6SBram Moolenaar let save_rtp = &rtp 27162d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 27172d6b20d6SBram Moolenaar augroup test 27182d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 27192d6b20d6SBram Moolenaar augroup END 27202d6b20d6SBram Moolenaar 27212d6b20d6SBram Moolenaar normal Y 27222d6b20d6SBram Moolenaar 27232d6b20d6SBram Moolenaar augroup test 27242d6b20d6SBram Moolenaar autocmd! 27252d6b20d6SBram Moolenaar augroup END 27262d6b20d6SBram Moolenaar delete('Xdir', 'rf') 27272d6b20d6SBram Moolenaar &rtp = save_rtp 27282d6b20d6SBram Moolenaarenddef 27292d6b20d6SBram Moolenaar 273077e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 273177e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 273277e5dcc3SBram Moolenaar let lines =<< trim END 273377e5dcc3SBram Moolenaar vim9script 273477e5dcc3SBram Moolenaar def crash#func() 273577e5dcc3SBram Moolenaar try 273677e5dcc3SBram Moolenaar for x in List() 273777e5dcc3SBram Moolenaar endfor 273877e5dcc3SBram Moolenaar catch 273977e5dcc3SBram Moolenaar endtry 274077e5dcc3SBram Moolenaar g:ok = true 274177e5dcc3SBram Moolenaar enddef 274277e5dcc3SBram Moolenaar fu List() 274377e5dcc3SBram Moolenaar invalid 274477e5dcc3SBram Moolenaar endfu 274577e5dcc3SBram Moolenaar try 274677e5dcc3SBram Moolenaar invalid 274777e5dcc3SBram Moolenaar catch /wontmatch/ 274877e5dcc3SBram Moolenaar endtry 274977e5dcc3SBram Moolenaar END 275077e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 275177e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 275277e5dcc3SBram Moolenaar 275377e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 275477e5dcc3SBram Moolenaar lines =<< trim END 275577e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 275677e5dcc3SBram Moolenaar call crash#func() 275777e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 27589c4f5520SBram Moolenaar qall! 275977e5dcc3SBram Moolenaar END 276077e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 276177e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 276277e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 276377e5dcc3SBram Moolenaar 276477e5dcc3SBram Moolenaar delete('Xdidit') 276577e5dcc3SBram Moolenaar delete('Xscript') 276677e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 276777e5dcc3SBram Moolenaarenddef 276877e5dcc3SBram Moolenaar 276981e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 277081e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 277181e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 277281e17fbeSBram Moolenaar let lines =<< trim END 277381e17fbeSBram Moolenaar let s:counter = 1 277481e17fbeSBram Moolenaar def s:Func() 277581e17fbeSBram Moolenaar au! CursorHold 277681e17fbeSBram Moolenaar au CursorHold * s:counter += 1 277781e17fbeSBram Moolenaar enddef 277881e17fbeSBram Moolenaar call s:Func() 277981e17fbeSBram Moolenaar doau CursorHold 278081e17fbeSBram Moolenaar call assert_equal(2, s:counter) 278181e17fbeSBram Moolenaar au! CursorHold 278281e17fbeSBram Moolenaar END 278381e17fbeSBram Moolenaar CheckScriptSuccess(lines) 278481e17fbeSBram Moolenaarenddef 278581e17fbeSBram Moolenaar 27863896a105SBram Moolenaardef Test_cmdline_win() 27873896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 27883896a105SBram Moolenaar # the command line window. 27893896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 27903896a105SBram Moolenaar let export_lines =<< trim END 27913896a105SBram Moolenaar vim9script 27923896a105SBram Moolenaar export let That = 'yes' 27933896a105SBram Moolenaar END 27943896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 27953896a105SBram Moolenaar let import_lines =<< trim END 27963896a105SBram Moolenaar vim9script 27973896a105SBram Moolenaar import That from './Xexport.vim' 27983896a105SBram Moolenaar END 27993896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 28003896a105SBram Moolenaar let save_rtp = &rtp 28013896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 28023896a105SBram Moolenaar syntax on 28033896a105SBram Moolenaar augroup CmdWin 28043896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 28053896a105SBram Moolenaar augroup END 28063896a105SBram Moolenaar # this will open and also close the cmdline window 28073896a105SBram Moolenaar feedkeys('q:', 'xt') 28083896a105SBram Moolenaar assert_equal('yes', g:got_there) 28093896a105SBram Moolenaar 28103896a105SBram Moolenaar augroup CmdWin 28113896a105SBram Moolenaar au! 28123896a105SBram Moolenaar augroup END 28133896a105SBram Moolenaar &rtp = save_rtp 28143896a105SBram Moolenaar delete('rtp', 'rf') 28153896a105SBram Moolenaarenddef 28163896a105SBram Moolenaar 2817e3d4685fSBram Moolenaardef Test_invalid_sid() 2818e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 281925859dd7SBram Moolenaar 28209c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 2821d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 2822e3d4685fSBram Moolenaar endif 2823e3d4685fSBram Moolenaar delete('Xdidit') 2824e3d4685fSBram Moolenaarenddef 2825e3d4685fSBram Moolenaar 2826f0afd9e1SBram Moolenaardef Test_unset_any_variable() 2827f0afd9e1SBram Moolenaar let lines =<< trim END 2828f0afd9e1SBram Moolenaar let var: any 2829f0afd9e1SBram Moolenaar assert_equal(0, var) 2830f0afd9e1SBram Moolenaar END 2831f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 2832f0afd9e1SBram Moolenaarenddef 2833f0afd9e1SBram Moolenaar 2834*7e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 283558dbef33SBram Moolenaar CheckRunVimInTerminal 283658dbef33SBram Moolenaar 2837*7e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 2838*7e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 2839*7e9210eaSBram Moolenaarendfunc 2840*7e9210eaSBram Moolenaar 2841*7e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 28429c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 28439c4f5520SBram Moolenaar let lines =<< trim END 28449c4f5520SBram Moolenaar func CheckAndQuit() 28459c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 28469c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 28479c4f5520SBram Moolenaar endfunc 28489c4f5520SBram Moolenaar END 28499c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 28509c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 28519c4f5520SBram Moolenaar let buf = RunVimInTerminal('-S XcallFunc', #{rows: 6}) 28529c4f5520SBram Moolenaar # define Afunc() on the command line 28539c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 28549c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 28559c4f5520SBram Moolenaar WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))}) 28569c4f5520SBram Moolenaar 28579c4f5520SBram Moolenaar call StopVimInTerminal(buf) 28589c4f5520SBram Moolenaar delete('XcallFunc') 28599c4f5520SBram Moolenaar delete('Xdidcmd') 28609c4f5520SBram Moolenaarenddef 28619c4f5520SBram Moolenaar 2862585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2863585fea7bSBram Moolenaardef Test_substitute_cmd() 2864585fea7bSBram Moolenaar new 2865585fea7bSBram Moolenaar setline(1, 'something') 2866585fea7bSBram Moolenaar :substitute(some(other( 2867585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2868585fea7bSBram Moolenaar bwipe! 2869585fea7bSBram Moolenaar 2870f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2871585fea7bSBram Moolenaar let lines =<< trim END 2872585fea7bSBram Moolenaar vim9script 2873585fea7bSBram Moolenaar new 2874585fea7bSBram Moolenaar setline(1, 'something') 2875585fea7bSBram Moolenaar :substitute(some(other( 2876585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2877585fea7bSBram Moolenaar bwipe! 2878585fea7bSBram Moolenaar END 2879585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2880585fea7bSBram Moolenaar source Xvim9lines 2881585fea7bSBram Moolenaar 2882585fea7bSBram Moolenaar delete('Xvim9lines') 2883585fea7bSBram Moolenaarenddef 2884585fea7bSBram Moolenaar 28858a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2886